簡體   English   中英

在php中序列化mysql時使用htmlentities和htmlspecialchars在輸入中使用單引號破壞回聲

[英]Single quote breaking echo in input using htmlentities & htmlspecialchars when serialized mysql in php

更新:所以我花了一天時間閱讀有關 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。 額外的意見將不勝感激。


原文:通常,當我在 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\";}}}

當我去檢索數據時,將其反序列化並回顯到我的頁面中,如果第一個字段(實際上是數組中數組的鍵)有引號,則回顯沒問題,但是接下來的 2 個值會中斷並且不會回顯(在普通文本回顯中或在輸入字段中)。

如果 3 個值都沒有單引號,則所有 3 個值都在輸入中正確回顯。

如果第三個值有一個單引號,那么所有三個值都很好。 基本上,當我的頁面遇到單引號時,即使在使用 htmlentites 或 htmlspecialchars 之后,它也會破壞從數組中回顯的其余值。

我真的很難過。

嗯,我解決了。 對我來說很好的練習雖然 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];之后的一行$keyboard_arr = $bnd_keyboard_arr['keyboards'][$keyboard];

是的。 就像我說的,合資企業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM