2010-09-14 89 views
1

清理可能是sqlinjected的所有數據是好的還是愚蠢的想法?我寫了一個應該這樣做的函數,但我從來沒有看到它完成,並想知道這是否是一個糟糕的主意。 功能我寫道:清理所有數據的PHP函數

function sanitizeData() 
{ 
    $_SERVER['HTTP_USER_AGENT'] = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']); 
    foreach(array_keys($_COOKIE) as $key) 
    { 
      $_COOKIE[$key] = mysql_real_escape_string($_COOKIE[$key]); 
    } 
    foreach(array_keys($_POST) as $key) 
    { 
      $_POST[$key] = mysql_real_escape_string($_POST[$key]); 
    }  
    foreach(array_keys($_GET) as $key) 
    { 
      $_GET[$key] = mysql_real_escape_string($_GET[$key]); 
    } 
} 
+0

如何從魔術引號此不同,每個人有問題?只是不要這樣做。 – 2010-09-14 00:47:43

+0

你永遠不應該覆蓋超全球。你可以,但它會導致過去的安全漏洞(PHP內部錯誤),不推薦使用。 – 2010-09-14 00:50:09

回答

6

一個壞主意;這基本上是不推薦使用的magic_quotes的另一個版本。大部分數據可能不會進入數據庫,因此您最終會不必要地轉義,並可能發生雙重轉義。

而是根據需要使用預準備語句。看看mysqli_stmt(mysqli的一部分)和PDOStatement(PDO的一部分)。

+1

+1 - 我不明白爲什麼這麼多人發現SQL注入很複雜 - 使用準備好的語句會阻止整個類的攻擊冷(而不是你的應用程序因爲它不能被SQL注入而是安全的)。 – 2010-09-14 00:48:51

+0

好的謝謝。 – Lienau 2010-09-14 00:49:41

+0

@比利不完全。標識符不能被參數化。值得牢記。 – 2010-09-14 01:51:35

0

理解mysql_real_escape_string不消毒任何東西也是非常重要的。
通過應用此功能,您不會使任何數據安全。這是非常普遍的誤解。
這個函數只是轉義字符串分隔符。所以,它只適用於字符串,引號分隔的字符串。 因此,真正的消毒可能僅是這樣的:

$_GET[$key] = "'".mysql_real_escape_string($_GET[$key])."'"; 

即使這個人是不夠的。

但正如馬特所說,這將是非常糟糕的做法。甚至更多:事實上,不僅輸入數據應該正確格式化/參數化。它是數據庫功能,不是用戶輸入的一個!它與用戶輸入無關。一些數據可能不是來自用戶輸入,而是來自文件或其他查詢或某種服務 - 它們都應該正確格式化。這是非常重要的理解。

此外,您正在使用一種奇怪的方式來迭代數組。
這個人是比較常見的:

foreach($_GET as $key => $value) 
{ 
     $_GET[$key] = mysql_real_escape_string($value); 
} 
+0

好吧,它在那裏做了一些 - 它*做*做一些事情,如將NULL改爲\ 0,換行到\ n等等。如果它只是轉義引號,那麼就不需要它,因爲你可以只是使用字符串替換或addslashes。 (但是你不應該在實際代碼中使用字符串替換或addslashes) – 2010-09-14 02:47:19

+0

@Billy實際上只替換引號和反斜槓本身就足以滿足大多數情況:)有一個人要求打破utf8編碼數據的這種轉義,任何很多人嘗試過,但沒有運氣。如果你知道一種方式,它會很棒。但無論如何,這並不重要。我的觀點與此不同:單獨逃避對任何事情都沒有幫助 – 2010-09-14 03:01:29