2015-06-28 46 views
5

更新:已經有過一些這方面的啓發反應,要點是mysql功能已被棄用,並且也是mysqli允許你使用準備好的語句。這很有道理,而且很有幫助,而在我看來,「使用mysqli」既不富有建設性,也沒有幫助。注入攻擊與的mysql_query成功,但失敗mysqli_query

任何時候在SO上都會詢問PHP和MySQL問題,並且OP的代碼使用mysql_query,本能的社區反應是要評論他們應該使用mysqli函數族。

能否請您提供這樣一個場景,如果我的代碼是用mysql_query惡意用戶可能發動成功注入攻擊,但它是,如果同樣的攻擊嘗試的挫敗,但代碼中使用的mysqli的功能呢?假設一個語句中的多個查詢被禁用,就像典型的情況一樣。

+5

這實際上是誤導性的建議。 'mysqli'本身並不安全。這一切都取決於使用預準備語句→這與mysqli相當麻煩( - 但更容易與PDO一起使用)。 – mario

+1

還記得'mysql_query'已被棄用。確保人們不使用不贊成的代碼編寫總是很合理的建議。 – christopher

+0

這幾乎似乎屬於Meta,就像你開始解決你的問題一樣。 –

回答

6

我已經導致相信:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' "); 

可以用數值容易被破解的$idValue其關閉',然後添加額外的命令,如

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL"; 

雖然我知道你聲明多個語句被禁用,但不那麼可怕的是返回未經授權的數據,而不是直接在表中編輯數據,例如:

$idValue = "z' OR name IS NOT NULL OR name = 'x"; 

而與庫MySQLi存在可能性,該方法可以prepared statements使用,這將阻止其地位只是一個變量的外部變量的演技。如:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1"); 
mysqli->bind_param("s",$idValue); 
mysqli->execute(); 

我的bind_param理解是,變量將擁有所有的MySQL的關鍵字和關鍵轉義字符從而防止安全漏洞和未授權的行返回。

這是MySQL 沒有的選項。編寫的聲明有助於改進注入安全性,但他們不會阻止單獨注射攻擊,但更多應該被用作爲程序員更廣泛的戰略的一部分。

就像身穿防彈衣不會讓你立於不敗之地,但會大大提高你的生存機會。 MySQLi不是一個神奇的子彈,PDO也不是,但它們將提高整體的安全級別。

MySQL也被棄用,正如Christopher所述,不再維護意味着隨着其他技術的不斷髮展,漏洞的數量和問題只會增加。

摘要

如果你寫的MySQL 我爲你寫的MySQL語句相同的方式語句,那麼你將有來自打針沒有額外的保護。但是,MySQLi提供了準備好的語句,它可以顯着提高SQL注入的防禦能力,但底層數據庫接口本身的更改本身不會給你帶來任何固有的好處或保護,除非你選擇使用預準備語句

3

我想,沒有這種情況。更重要的是MySQLi支持準備語句,這是防止SQL注入最可靠的方法。如果您使用舊的MySQL API,則不支持這些高級功能。 MySQL和MySQLi都具有mysql * _real_escape_string函數,它可以在不使用引號的情況下進行攻擊,如1 OR 1

+1

我認爲準備語句的可用性是希望從MySQL遷移到MySQLi的主要原則,準備語句的方式減少了注入機會。 – Martin