本文主要介紹的是使用 addslashes,mysql_escape_string 和 mysql_real_escape_string 這三個函數對用戶提交的表單數據進行轉義處理的用法和區別。
首先需要明確的是addslashes,mysql_escape_string和mysql_real_escape_string這三個函數都是對即將要插入到數據庫中的數據進行過濾從而保證插入到數據庫中的數據的安全,防止數據庫遭到攻擊。那麼這三個函數有些什麼區別呢?
addslashes() 函數在指定的預定義字符前添加反斜槓。這些預定義字符是:
單引號 (')
雙引號 (")
反斜槓 (\)
NULL
mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符,必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用。
下列字符受影響:
\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。
本函數將 string 中的特殊字符轉義,並考慮到連接的當前字符集,因此可以安全用於 mysql_query()。
mysql_escape_string() 與 mysql_real_escape_string() 的區別就是前者不考慮連接的當前字符集,而後者考慮。具體這裡就不多說了,因為在 PHP 5.3 中已經棄用了這種方法,所以不推薦使用。
目前國內很多PHP coder僅僅依靠 addslashes 函數防止SQL語句注入,但這裡考慮的問題是不全面的。因為對於想繞過 addslashes 函數的黑客而言,他們可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改為0xbf5c27,成為一個有效的多字節字符,其中的0xbf5c仍會被看作是單引號,所以addslashes無法成功攔截。
當然 addslashes 函數也不是毫無用處,它是用於單字節字符串的處理,對於多字節字符還是用 mysql_real_escape_string 函數來處理吧。