更新:所以我花了一天时间阅读有关SQL注入和参数化查询的各种帖子。我想出了一些有用的东西,我认为这是对我的方法的合理更新。
$query = "UPDATE message_bundles SET bndName = ?, bndTagId = ?, bndSequence = ?, bndKeyboardArr = ? WHERE id = ?";
$stmt = mysqli_prepare($connection, $query);
mysqli_stmt_bind_param($stmt, 'siisi', $bnd_name, $bnd_tag_id, $bnd_sequence, $bnd_keyboard_arr, $id);
$result = mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
但是,我仍然有这个原始问题中描述的问题。当我回应数据时,它仍然打破它遇到的第一个单引号;我是否使用htmlspecialchars或htmlentities。其他评论将不胜感激。
ORIGINAL:通常当我在PHP中将字符串保存到MYSQL时,我运行一个函数(下面)来逃避引号。我正在做同样的事情,但在插入MYSQL之前我序列化了一个字符串数组。但是当我检索数组并对其进行单元化时,只有第一个字符串在输入字段内有一个单引号echo。然后数组中的其余字符串将不会回显。
这是我通过post构建数组的循环(请注意,添加到数组中的3个值是1)string,2)int,3)string;也许这就是我的问题所在:)
foreach ($bnd_keyboard as $key) {
if ($key['keyboard']) {
$keyboard = $key['keyboard'];
$target_bundle = $key['targetBundle'];
$code_execute = $key['codeExecute'];
$bnd_keyboard_arr["keyboards"][$keyboard] = array(
"targetBundle" => $target_bundle,
"codeExecute" => $code_execute
);
}
}
然后我的函数来转义引号(注意它是一个较旧的函数,可能需要更新,但直到现在才引起我任何问题):
function mysqli_prep($value) {
global $connection;
$magic_quotes_active = get_magic_quotes_gpc();
$new_enough_php = function_exists("mysqli_real_escape_string"); // i.e. PHP >= v4.3.0
if($new_enough_php) { // PHP v4.3.0 or higher
// undo any magic quote effects so mysql_real_escape_string can do the work
if($magic_quotes_active) {$value = stripslashes($value); }
$value = mysqli_real_escape_string($connection, $value);
} else { // before PHP v4.3.0
// if magic quotes aren't already on then add slashes manually
if(!$magic_quotes_active) {$value = addslashes($value); }
// if magic quotes are active, then the slashes already exist
}
return $value;
}
然后我在数组上运行这个函数并序列化它:
$bnd_keyboard_arr = mysqli_prep(serialize($bnd_keyboard_arr));
插入MYSQL之前的序列化数据如下所示:
a:1:{s:9:\"keyboards\";a:1:{s:5:\"aaa\'s\";a:2:{s:12:\"targetBundle\";s:2:\"93\";s:11:\"codeExecute\";s:3:\"aaa\";}}}
当我去检索数据时,将其反序列化并回显到我的页面中,如果第一个字段(实际上是数组中数组的KEY)有一个引号,那么它回显没问题,但接下来的2个值中断并且不会回显(在正常文本回显中或在输入字段内)。
如果3个值中没有一个具有单引号,则所有3个值都在输入内部正确回显。
如果第3个值有一个单引号,则所有三个回显都很好。基本上,当我的页面遇到单引号时,即使使用了htmlentites或htmlspecialchars,它也会破坏从数组中回显的其余值。
我真的很难过。
答案 0 :(得分:0)
好吧,我解决了。虽然b / c它强迫我升级我向MYSQL发送查询的方式,但对我来说是一个很好的练习。我认为这种方式已升级,但事实证明这与我原来的问题无关。
问题,一如既往的愚蠢,是:
我正在创建一个htmlspecialchars
字符串,就像:
$keyboard = htmlspecialchars($keyboard, ENT_QUOTES);
然后我从一个数组中获取一个值,除了使用我的$keyboard
值之外:
$keyboard_arr = $bnd_keyboard_arr['keyboards'][$keyboard];
当然,如果我在将该字符串插入数组键之前使用htmlspecialchars
转换$ keyboard字符串,那么它会中断$keyboard_arr
解决方案是将$keyboard_arr = $bnd_keyboard_arr['keyboards'][$keyboard];
移到$keyboard_arr = $bnd_keyboard_arr['keyboards'][$keyboard];
烨。就像我说的那样,JV。