php中防sql注入的安全代碼編程

int get_magic_quotes_gpc ( void )

Returns the current configuration setting of magic_quotes_gpc (0 for off, 1 for on).

<?php
echo get_magic_quotes_gpc(); // 1
echo $_POST['lastname']; // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly

if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}

echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>
string addslashes ( string str )

返回字符串,該字符串爲了數據庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(')、雙引號(")、反斜線(\)與 NUL(NULL 字符)。

一個使用 addslashes() 的例子是當你要往數據庫中輸入數據時。例如,將名字 O'reilly 插入到數據庫中,這就需要對其進行轉義。大多數據庫使用 \ 作爲轉義符:O\'reilly。這樣可以將數據放入數據庫中,而不會插入額外的 \。當 PHP 指令 magic_quotes_sybase 被設置成 on 時,意味着插入 ' 時將使用 ' 進行轉義。

默認情況下,PHP 指令 magic_quotes_gpc 爲 on,它主要是對所有的 GET、POST 和 COOKIE 數據自動運行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字符串使用 addslashes(),因爲這樣會導致雙層轉義。遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。

許多數據庫本身就提供這種輸入數據處理功能。例如PHP的MySQL操作函數中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函數,可將特殊字符和可能引起數據庫操作出錯的字符轉義。那麼這三個功能函數之間有什麼卻別呢?下面我們就來詳細講述下。

雖然國內很多PHP程序員仍在依靠addslashes防止SQL注入,還是建議大家加強中文防止SQL注入的檢查。addslashes的問題在於黑客可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改爲0xbf5c27,成爲一個有效的多字節字符,其中的0xbf5c仍會被看作是單引號,所以addslashes無法成功攔截。

當然addslashes也不是毫無用處,它是用於單字節字符串的處理,多字節字符還是用mysql_real_escape_string吧。

總結一下:


* addslashes() 是強行加;
* mysql_real_escape_string() 會判斷字符集,但是對PHP版本有要求;
* mysql_escape_string不考慮連接的當前字符集。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章