我已經導致相信:
$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注入的防禦能力,但底層數據庫接口本身的更改本身不會給你帶來任何固有的好處或保護,除非你選擇使用預準備語句。
這實際上是誤導性的建議。 'mysqli'本身並不安全。這一切都取決於使用預準備語句→這與mysqli相當麻煩( - 但更容易與PDO一起使用)。 – mario
還記得'mysql_query'已被棄用。確保人們不使用不贊成的代碼編寫總是很合理的建議。 – christopher
這幾乎似乎屬於Meta,就像你開始解決你的問題一樣。 –