2012-02-22 108 views
-1

這是在運行數據庫查詢之前防止SQL注入的好方法嗎?使用mysql_real_escape_string和stripslashes避免SQL注入

$name = mysql_real_escape_string(stripslashes($name)); 
$age = mysql_real_escape_string(stripslashes($age)); 
$location = mysql_real_escape_string(stripslashes($location)); 

在此先感謝!

+3

爲什麼你需要'stripslashes'以及如何使用[PDO](http://php.net/manual/en/book.pdo.php)? – 2012-02-22 11:34:55

+0

簡短的回答 - 不,不是。不要使用'mysql_ *'函數,但使用PDO,就像@Click建議的那樣。 – 2012-02-22 11:38:42

+0

你的代碼打破了最近/正確配置(魔術引號禁用)PHP安裝中包含反斜槓的任何字符串。切勿無條件使用'stripslashes'。只有當'get_magic_quotes_gpc()'存在並返回'true'時才使用它! – ThiefMaster 2012-02-22 12:27:12

回答

4

這回答得好:

所以,你能做什麼呢?解決方案是使用準備好的語句,其中 幾乎所有的PHP數據庫擴展都支持,而MySQL(ext/mysql)和SQLite2(ext/sqlite)的例外是 。 因此,爲了安全起見,我建議使用PDO接口與 這些數據庫進行會談,或者在MySQL使用較新的MySQLi (ext/mysqli)擴展的情況下。這些接口提供了準備好的語句 支持,它允許在查詢結構和查詢參數之間進行分隔。

因此,要安全一側,不要單獨依靠mysql_real_escape_string,使用準備好的語句要好得多。

+2

這個答案爲什麼downvoted?它提供了關於'mysql_real_escape_string'的有用信息,以及何時失敗。至少downvoter可能已經評論他們認爲是錯誤的答案。 – 2012-02-22 11:38:13

+0

那麼,你發佈的鏈接是通過在一個非常特殊的情況下轉向mysql_ *來推斷觀點。爲什麼有人需要甚至允許多字節字符,當他們的mysql字符集不應該支持它?雖然PDO似乎以自己的方式處理這個問題,但是mysql_ *如何被證明不太安全? – 2012-02-22 12:48:23

+0

@ N.B。 Alshanetsky描述的安全漏洞是非常深奧的(曾用過GBK字符集?),並且可以通過設置正確的連接編碼來解決。我同意'mysql_()'庫已經過時,使用PDO是優越的,但是完全可以用它創建安全的查詢,所以「使用PDO確定」是不正確的。另外,「使用PDO」已經成爲一個真正有害的模因 - 我最近與一些人長時間討論過任何*查詢都被自動保護,因爲他使用了PDO,給他留下了一個巨大的注入漏洞。 – 2012-02-22 13:15:55