使用預準備語句防範 SQL 注入
準備好的語句透過將程式碼與使用者提供的資料完全分離,提供了針對 SQL 注入漏洞的強大防禦。
了解 SQL 注入威脅
當不可信資料直接嵌入 SQL 查詢中時,就會發生 SQL 注入攻擊。 這種危險的做法模糊了程式碼和資料之間的界限,使攻擊者能夠注入惡意命令。 一個簡單的例子說明了風險:
<code class="language-sql">$query = "SELECT * FROM users WHERE id = '" . $_GET['id'] . "'";</code>
如果 $_GET['id']
包含 1; DROP TABLE users; --
,結果查詢將變為:
<code class="language-sql">SELECT * FROM users WHERE id = '1; DROP TABLE users; --';</code>
此惡意輸入執行 DROP TABLE users
指令,可能會破壞資料庫。
準備好的語句的機制
準備好的語句透過將查詢結構與資料分開來解決此漏洞。 過程包括兩個步驟:
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");</code>
?
充當資料的佔位符。
<code class="language-php">$stmt->execute([$id]);</code>
資料庫使用提供的資料執行預編譯的查詢。重要的是,數據被視為數據,而不是可執行程式碼,從而防止注入攻擊。
PHP/MySQL 實作
這是使用準備好的語句的上一個範例的安全版本:
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?"); $stmt->bind_param("i", $expectedData); // "i" specifies integer data type $stmt->execute();</code>
即使$expectedData
包含惡意輸入,它也會被視為資料值,而不是SQL程式碼。
重要注意事項
雖然準備好的聲明非常有效,但它們並不能提供完整的保護。 它們主要防止資料文字注入。 如果在查詢中動態建立識別符(表名或列名),則額外的安全措施至關重要。
以上是準備好的語句如何防止SQL注入攻擊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!