何時使用mysql_real_escape_string是否正確?何時使用mysql_real_escape_string()
當我使用isset我應該使用它(函數mysql_escape_string($ _ GET [ 'PARAM'])),
當我使用我應該使用它$富= mysql_real_escape_string($ _ GET [ '酒吧'] );
謝謝
何時使用mysql_real_escape_string是否正確?何時使用mysql_real_escape_string()
當我使用isset我應該使用它(函數mysql_escape_string($ _ GET [ 'PARAM'])),
當我使用我應該使用它$富= mysql_real_escape_string($ _ GET [ '酒吧'] );
謝謝
您需要在構建帶有字符串文字的SQL查詢時調用此函數。
你不應該在別處叫它。
調用此函數的目的是阻止您執行像SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'
這樣的SQL。
mysql_real_escape_string
將轉義'
字符,以便將邪惡字符串完全視爲字符串。
只要不信任您在mysql查詢中插入的數據以防止sql注入,就應該使用它。例如,所有用戶都會形成數據。 在你的第一個例子中:沒有。 第二個例子:是的,如果你打算在查詢中使用$ foo變量。
無論何時將數據插入數據庫查詢(POST/GET數據),您都應該使用它,但如果您只需要檢查數據,則不應使用它。
無論何時您想要在查詢中使用用戶的輸入,都可以使用mysql_real_escape_string。
下面是如何使用它:
$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = '$user' AND password = '$password' ";
//the quotes are vital !! ^ ^or you will not be safe!
這裏的示例代碼不工作:
斷碼
$user = mysql_real_escape_string('$_GET['user']);
$password = MD5($user.$_GET['password']);
$query = "SELECT * FROM users WHERE user = $user AND password = '$password' ";
在我可以登錄到比如你係統通過輸入任何密碼和
user or (1=1) --
。這將使查詢讀取:
SELECT * FROM users WHERE user = user or (1=1) -- AND password = '$password
並且將批准所有登錄,因爲密碼永遠不會被檢查。
使用的mysql_query,你永遠只能同時執行一個SQL語句,所以:
$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysql_query($query);
將導致一個錯誤,因爲不能成爲;
後的一部分。
此代碼然而將工作:
危險
$query = "SELECT * FROM a; DELETE FROM a WHERE (1=1)"
mysqli_query($query);
因爲提高 mysqli_query並允許兩個或更多的語句來一氣呵成執行。
親愛的駕駛者downvoter,這個答案是什麼不正確? – Johan 2012-03-16 12:31:50
您需要**瞭解**這裏的問題,否則最終會產生安全漏洞。 – SLaks 2011-06-05 15:32:10
這就是爲什麼我問這個問題,因爲我不明白。 – Harigntka 2011-06-05 15:34:34