$_POST = mysql_real_escape_string($_POST);
通過執行此語句,每個帖子值現在是否通過mysql_real_escape_string
轉義?這會允許mysql_real_escape_string全局工作嗎?
$_POST = mysql_real_escape_string($_POST);
通過執行此語句,每個帖子值現在是否通過mysql_real_escape_string
轉義?這會允許mysql_real_escape_string全局工作嗎?
不,那根本不起作用:$_POST
是一個數組:mysql_real_escape_string
需要一個字符串作爲它的第一個參數。你可以,但是,實現你想要的與array_map
:
$_POST = array_map('mysql_real_escape_string', $_POST);
或者array_walk_recursive
爲array_map
在陣列後的值不起作用:
array_walk_recursive($_POST, function(&$v, $k) {$v = mysql_real_escape_string($v);});
更好,但是,這是使用paramaterised查詢:此是迄今爲止避免SQL注入的最安全的方法。上述選項不僅不需要轉義(例如,不需要插入數據庫的$_POST
數組的成員),而且還使得難以在其他上下文中使用數據,例如,以某種方式將它們返回給瀏覽器。
事實上,答案更新以反映這一點,而達米恩的正確答案是積極的。其他警告仍然適用。 – lonesomeday
當然,我認爲其他謹慎是真正的謹慎,映射陣列我認爲是不治癒的原因,沒有銀彈。 – hakre
由於$ _POST是一個數組,這會給你一個錯誤。
鏈接:http://php.net/manual/en/function.mysql-real-escape-string.php
沒有,但你可以使用array_walk()
Docs或array_walk_recursive()
Docs實現這一目標,作爲mysql_real_escape_string()
Docs需要一個字符串(去圖...)作爲輸入,而你傳遞一個數組來代替。 有了這個,你通過每個數組元素相同的回調函數:
array_walk_recursive($_POST, 'escape');
escape($k,$v)
{
return mysql_real_escape_string($v);
}
但最好相應對待每一個值,爲前。將INT轉換爲INT等,或者更好,use parametrized queries。
@hakre謝謝,如果您發現錯誤,隨時編輯我的答案 –
$ escapedPost = array_map(array($ this,'recursive_escape'),$ _POST);
/**
* recursively escape an array containing strings and/or arrays
*/
function recursive_escape($value) {
if (is_array($value)) {
array_map(array($this, 'recursive_escape'), $value);
} else {
$value = mysql_real_escape_string($value);
}
return $value;
}
此功能不應該被使用,因爲它恢復了已經從語言中刪除的魔術引號功能。 –
請閱讀[常見問題](http://stackoverflow.com/faq)。 – hakre
閱讀。感謝您的雙重提醒。 – user975096
我認爲你正在尋找這樣的:[停止SQL注入PHP的最佳途徑](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – hakre