mysql_real_escape_string() 和 mysql_escape_string() 足以確保應用程式安全嗎?
雖然這些函數可以提供一些針對 SQL 注入和其他攻擊的保護,但他們未能解決某些漏洞。
SQL如果您在查詢中不正確地處理 PHP 變量,注入
Mysql_real_escape_string() 仍然可以將您的應用程式暴露於 SQL 注入。考慮以下範例:
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
攻擊者可以操縱此查詢來執行未經授權的 SQL 語句,因為 mysql_real_escape_string() 並非旨在保護表名、列名或 LIMIT 欄位。
類似攻擊
Mysql_real_escape_string() 不足以防止 LIKE 漏洞。攻擊者可以輸入「%%」等惡意值來傳回所有記錄,從而可能洩露敏感資訊。
字元集漏洞
某些瀏覽器可能容易受到字元集的攻擊漏洞利用,允許攻擊者註入繞過轉義機制的惡意字元並執行任意SQL 指令。
準備語句:A綜合解決方案
為了有效保護您的應用程序,建議使用準備好的語句而不是 mysql_real_escape_string()。準備好的語句透過將使用者提供的值綁定為參數來執行 SQL 查詢。這消除了手動轉義的需要,並確保只執行授權的 SQL。
以下是在 PHP 中使用準備好的語句的範例:
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
Prepared statements 透過利用底層資料庫伺服器的安全功能提供主動防禦機制。它們本質上能夠抵抗已知和未知的攻擊,從而確保資料的完整性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3