使用 `mysql_real_escape_string()` 和 `mysql_escape_string()` 足以保護您的應用程式嗎?

Mary-Kate Olsen
發布: 2024-11-03 10:58:03
原創
570 人瀏覽過

Is Using `mysql_real_escape_string()` and `mysql_escape_string()` Enough to Secure Your Application?

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 欄位。

Like 攻擊

Mysql_real_escape_string() 不足以防止 LIKE 攻擊。攻擊者可以輸入「%%」等惡意值來傳回所有記錄,從而可能危及敏感資訊。

字元集漏洞

某些瀏覽器可能容易受到字元集的攻擊漏洞利用,允許攻擊者註入繞過轉義機制的惡意字元並執行任意SQL 指令。

準備好的語句:全面的解決方案

為了有效保護您的應用程序,它是建議使用準備好的語句而不是 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())) { }
登入後複製

準備好的語句透過以下方式提供主動防禦機制:利用底層資料庫伺服器的安全功能。它們本質上能夠抵抗已知和未知的攻擊,從而確保資料的完整性。

以上是使用 `mysql_real_escape_string()` 和 `mysql_escape_string()` 足以保護您的應用程式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板