[英]When to use mysql_real_escape_string()
何時是使用 mysql_real_escape_string 的正確時間?
當我使用 isset(mysql_escape_string($_GET['param'])) 時,我應該使用它嗎?
當我使用 $foo = mysql_real_escape_string($_GET['bar']); 時我應該使用它嗎?
謝謝
在使用字符串文字構建 SQL 查詢時,您需要調用此 function。
你不應該在其他任何地方調用它。
調用這個 function 的目的是防止您像SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'
SELECT * FROM Students WHERE Name = 'Robert'); DROP TABLE Students;--'
.
mysql_real_escape_string
將轉義'
字符,以便將惡意字符串完全視為字符串。
每當您不信任在 mysql 查詢中插入的數據時,都應該使用它來防止 sql 注入。 例如所有用戶 forms 數據。 在你的第一個例子中:不。 第二個示例:是的,如果您要在查詢中使用 $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 確實允許在一個 go 中執行兩個或多個語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.