2012-09-27 15 views
0

我已經閱讀過各種文章,建議在SQL查詢中使用Prepared statements,但由於mysql_ lib does not allow executing 2 queries in one statement值得使用它們,因爲如果我只需要在頁面執行時觸發一次查詢,它的一些案件的mysql_query也似乎忽略無效後的數據(如'ADMIN' OR 1--爲什麼在SQL查詢中使用Prepard Statements/mysql_real_escape_string

$username = $_POST['username']; 
$password = $_POST['password']; 

mysql_query("SELECT * FROM users WHERE username=$username AND password=$password"); 

//processing 

現在,如果有人通過「用戶名」爲

'ADMIN' OR 1-- 

上述查詢dosent取「管理員」行!這是mysql_query的一項功能,它在'1'/Special chars之後忽略註釋。 SQL注入會發生怎樣在這種情況下,運行MySQL 5.5和PHP 5.3

+0

該查詢將簡單地打破未加引號的字符串(在這種情況下爲'password')。 – jeroen

+0

http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/ – Quentin

回答

2

也許'ADMIN' OR 1--不起作用,但'ADMIN' OR 'x' = 'y'肯定會,因爲這將導致該SQL查詢:

SELECT * 
    FROM users 
WHERE username = 'ADMIN'     -- true 
    OR 'x' = 'y' AND password = 'whatever' -- false, but who cares? 
; 

一般教訓:編碼安全性很難,因爲我們不習慣考慮積極尋求破壞我們的代碼的惡意代理人。 SQL注入是一個已解決的問題,並且解決方案是參數化查詢,所以您應該使用它,而不是試圖推出自己的嘗試解決方案。

+0

如果我們使用'mysql_real_escape_string()'.than我們應該使用'mysqli' – StaticVariable

+0

如果你努力使用'mysql_real_escape_string( )'那麼你很安全。問題是我們是人類,有時忘記(我知道我有)。準備好的陳述不能犯這個錯誤。 – Barmar

+0

@Barmar:這是真的,但問題的標題是「爲什麼使用Prepard Statements/mysql_real_escape_string進行SQL查詢」,所以我不認爲OP在詢問爲什麼我們應該使用預處理語句*而不是* mysql_real_escape_string' 。 – ruakh