MySQL 注入攻擊:深入探究
簡介
確保Web Web 應用程式的安全至關重要,而資料庫保護是這項工作的重要組成部分。本文研究了使用 mysql_real_escape_string() 和 mysql_escape_string() 在防範 SQL 攻擊方面的有效性。
轉義函數足以確保安全嗎?
mysql_real_escape_string() 和 mysql_escape_string () 通常用於在插入資料之前轉義資料進入 SQL 查詢。然而,這些函數是否足以抵禦所有攻擊向量?
專家意見
根據專家的說法,mysql_real_escape_string() 並不能提供針對 SQL 注入的完整保護。這是因為它只是為了轉義查詢中的 PHP 變數。它無法處理轉義表或列名稱或 LIMIT 欄位。
已知攻擊的漏洞
考慮以下範例:
$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
此查詢如果$field 或$value 包含惡意輸入,則容易受到SQL 注入。駭客可以製作繞過轉義並執行未經授權的命令的惡意查詢。
特定攻擊向量
示範
以下程式碼示範如何利用這些攻擊:
$sql = sprintf("SELECT url FROM GrabbedURLs WHERE %s LIKE '%s%%' LIMIT %s", mysql_real_escape_string($argv[1]), mysql_real_escape_string($argv[2]), mysql_real_escape_string($argv[3]));
解決方案:已準備好語句
專家建議使用準備好的語句而不是轉義函數。預準備語句是伺服器端技術,可確保僅執行有效的 SQL。這種方法提供了對已知和未知 SQL 注入的全面保護。
使用PDO 的範例
$sql = 'SELECT url FROM GrabbedURLs WHERE ' . $column . '=? LIMIT ?'; $statement = $pdo->prepare($sql); $statement->execute(array($value, $limit));
此程式碼使用準備好的語句來轉義使用者輸入並執行查詢
結論
雖然mysql_real_escape_string() 和mysql_escape_string() 提供了一些針對 SQL 注入的保護,但它們不足以實現完全的安全性。準備好的語句是增強資料庫安全性的建議方法。
以上是`mysql_real_escape_string()` 和 `mysql_escape_string()` 足以防止 MySQL 注入攻擊嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!