单引号在输入中使用htmlentities& amp;在php

时间:2016-04-21 18:01:18

标签: php mysql arrays serialization

更新:所以我花了一天时间阅读有关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,它也会破坏从数组中回显的其余值。

我真的很难过。

1 个答案:

答案 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。