2011-06-05 50 views
1

何時使用mysql_real_escape_string是否正確?何時使用mysql_real_escape_string()

當我使用isset我應該使用它(函數mysql_escape_string($ _ GET [ 'PARAM'])),

當我使用我應該使用它$富= mysql_real_escape_string($ _ GET [ '酒吧'] );

謝謝

+2

您需要**瞭解**這裏的問題,否則最終會產生安全漏洞。 – SLaks 2011-06-05 15:32:10

+0

這就是爲什麼我問這個問題,因爲我不明白。 – Harigntka 2011-06-05 15:34:34

回答

1

您需要在構建帶有字符串文字的SQL查詢時調用此函數。
你不應該在別處叫它。

調用此函數的目的是阻止您執行像SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'這樣的SQL。
mysql_real_escape_string將轉義'字符,以便將邪惡字符串完全視爲字符串。

+0

謝謝,我現在明白了。 – Harigntka 2011-06-05 15:37:22

+1

mysql_real_escape_string()與'mysql_query'和'mysql_query'一起工作**不**一次執行兩個查詢。 **那個特殊的注入漏洞不是問題,只有mysqli_query。此外,你沒有聲明你需要把''''''單引號括起來。 -1爲不正確和不完整的答案。 – Johan 2011-06-05 16:14:04

0

只要不信任您在mysql查詢中插入的數據以防止sql注入,就應該使用它。例如,所有用戶都會形成數據。 在你的第一個例子中:沒有。 第二個例子:是的,如果你打算在查詢中使用$ foo變量。

0

無論何時將數據插入數據庫查詢(POST/GET數據),您都應該使用它,但如果您只需要檢查數據,則不應使用它。

-1

無論何時您想要在查詢中使用用戶的輸入,都可以使用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! 

這裏的示例代碼不工作:

enter image description here斷碼

$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並允許兩個或更多的語句來一氣呵成執行。

+0

親愛的駕駛者downvoter,這個答案是什麼不正確? – Johan 2012-03-16 12:31:50

相關問題