我們在使用php+mysql時,一般情況下都要接受用戶輸入的數據,這就意味著很大的風險,因為用戶可能輸入正常數據,也可能輸入惡意的代碼。作為developer,必須嚴格過濾用戶的數據,來保護我們的網站安全。 PHP中可以使用 mysql_real_escape_string 函數來過濾非法字符。本函數將 string 中的特殊字符轉義,并考慮到連接的當前字符集,因此可以安全用于 mysql_query()。 mysql_real_escape_string() 函數轉義 SQL 語句中使用的字符串中的特殊字符。下列字符受影響:\x00
\n
\r
\
'
"
\x1a
如果成功,則該函數返回被轉義的字符串。如果失敗,則返回 false。 飄易利用下面的這個函數,就可以有效過濾了。function safe($s){ //安全過濾函數
if(get_magic_quotes_gpc()){ $s=stripslashes($s); }
$s=mysql_real_escape_string($s);
return $s;
}
或者在conn公共連接文件里加入,這樣就無需修改代碼了:if(get_magic_quotes_gpc()) { $_REQUEST = array_map( 'stripslashes', $_REQUEST); }
$_REQUEST = array_map( 'mysql_real_escape_string', $_REQUEST);
mysql_real_escape_string語法mysql_real_escape_string(string,connection)參數 描述string 必需。規定要轉義的字符串。connection 可選。規定 MySQL 連接。如果未規定,則使用上一個連接。 其實,一般的還可以利用這個函數 addslashes 進行轉義。作用同樣為對GET、POST、COOKIE過來的字符串進行轉義處理,通常與 magic_quotes_gpc 結合使用。 下面講述下addslashes 、magic_quotes_gpc、mysql_real_escape_string 三者之間的區別: 1、addslashes 與 mysql_real_escape_string,同樣的作用是經過轉義后,可直接插入數據庫, 國內很多PHP coder是使用addslashes函數防止SQL注入,但是建議大家使用后者轉義數據。 舉例說明:addslashes的問題在于黑客可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改為0xbf5c27,成為一個有效的多字節字符,其中的0xbf5c仍會被看作是單引號,所以addslashes無法成功攔截。 兩者何時用:addslashes也不是毫無用處,它是用于單字節字符串的處理,多字節字符還是用mysql_real_escape_string更加安全。 2、magic_quotes_gpc的說明,在首次客戶端運行時,可用第一條的舉例,對 magic_quotes_gpc 進行 $_['name'] 判斷,可轉義處理。 3、 mysql_real_escape_string和 mysql_escape_string 這2個函數的區別: mysql_real_escape_string 必須在(PHP 5以上、PHP 4 >= 4.3.0)版本的情況下才能使用。否則只能用 mysql_escape_string 。 兩者的區別是:mysql_real_escape_string 考慮到連接的當前字符集,而 mysql_escape_string 不考慮。 4、實際開發中,正確的邏輯處理,如下: 首先,檢查 magic_quotes_gpc 是否配置為自動轉義斜線,若為on,應該調用stripslashes去掉$_REQUEST、$_GET,$_POST、$_COOKIE的轉義斜線;然后,查詢/寫入/更新數據至mysql時,再使用mysql_real_escape_string進行字符轉義
。[參考]:1、討論magic_quotes_gpc、mysql_real_escape_string、addslashes的區別及用法http://blog.unvs.cn/archives/magic_quotes_gpc-mysql_real_escape_string-addslashes.html