2011-10-03 51 views
0
$_POST = mysql_real_escape_string($_POST); 

通過執行此語句,每個帖子值現在是否通過mysql_real_escape_string轉義?這會允許mysql_real_escape_string全局工作嗎?

+0

請閱讀[常見問題](http://stackoverflow.com/faq)。 – hakre

+0

閱讀。感謝您的雙重提醒。 – user975096

+0

我認爲你正在尋找這樣的:[停止SQL注入PHP的最佳途徑](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – hakre

回答

4

不,那根本不起作用:$_POST是一個數組:mysql_real_escape_string需要一個字符串作爲它的第一個參數。你可以,但是,實現你想要的與array_map

$_POST = array_map('mysql_real_escape_string', $_POST); 

或者array_walk_recursivearray_map在陣列後的值不起作用:

array_walk_recursive($_POST, function(&$v, $k) {$v = mysql_real_escape_string($v);}); 

更好,但是,這是使用paramaterised查詢:此是迄今爲止避免SQL注入的最安全的方法。上述選項不僅不需要轉義(例如,不需要插入數據庫的$_POST數組的成員),而且還使得難以在其他上下文中使用數據,例如,以某種方式將它們返回給瀏覽器。

+0

事實上,答案更新以反映這一點,而達米恩的正確答案是積極的。其他警告仍然適用。 – lonesomeday

+0

當然,我認爲其他謹慎是真正的謹慎,映射陣列我認爲是不治癒的原因,沒有銀彈。 – hakre

3

沒有,但你可以使用array_walk()Docsarray_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

+0

@hakre謝謝,如果您發現錯誤,隨時編輯我的答案 –

-2

$ 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; 
} 
+1

此功能不應該被使用,因爲它恢復了已經從語言中刪除的魔術引號功能。 –