![](/img/trans.png)
[英]PHP htmlentities and htmlspecialchars are breaking my strings
[英]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.