MySQL 安全性:mysql_real_escape_string() 和 mysql_escape_string() 夠嗎?
mysql_real_escape_string() 和 mysql_escape_string() 對於應用程式安全性的功效引發了一些爭論。雖然這些函數可以防止已知的 SQL 注入向量,但它們的限制可能會讓您容易受到更高級的攻擊。
SQL 注入敏感性
儘管使用mysql_real_escape_string(),您可能會在PHP 變數整合到查詢中的場景中,仍然容易受到SQL 注入的影響。例如,考慮以下程式碼:
<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);</code>
熟練的駭客可以透過以下輸入利用此查詢:
<code class="php">$field = "1=1" $value = "1"</code>
這繞過了預期的邏輯,而是返回(可能)所有記錄
LIKE 攻擊
mysql_real_escape_string() 無法有效防止LIKE 攻擊,例如:
<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " LIKE " . mysql_real_escape_string($value);</code>
A惡意使用者可以將$value 惡意使用者設定為% 來檢索所有記錄,從而可能暴露敏感資料。
字元集漏洞
即使在 2011 年,Internet Explorer 仍然容易受到字元集漏洞的攻擊。此漏洞可讓攻擊者控制您的資料庫,類似於 SQL 注入。
準備好的語句:主動方法
mysql_real_escape_string() 和 mysql_escape_string() 都容易受到攻擊,因為它們是反應性防禦機制。另一方面,準備好的語句提供了主動的解決方案。透過僅執行有效且已編程的 SQL,準備好的語句可以顯著降低意外 SQL 執行的風險,無論底層資料庫是否有漏洞。
以下是使用準備好的語句的範例:
<code class="php">$statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value));</code>
與使用 mysql_real_escape_string() 相比,準備好的語句既安全又簡潔。他們依靠資料庫伺服器的保護措施來防範已知和未知的威脅。
以上是mysql_real_escape_string() 和 mysql_escape_string() 足以保護 MySQL 應用程式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!