首頁 >資料庫 >mysql教程 >準備好的語句如何防止SQL注入攻擊?

準備好的語句如何防止SQL注入攻擊?

Barbara Streisand
Barbara Streisand原創
2025-01-23 20:48:11777瀏覽

How Do Prepared Statements Prevent SQL Injection Attacks?

使用預準備語句防範 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 指令,可能會破壞資料庫。

準備好的語句的機制

準備好的語句透過將查詢結構與資料分開來解決此漏洞。 過程包括兩個步驟:

  1. 查詢編譯:資料庫接收帶有佔位符的查詢結構:
<code class="language-php">$stmt = $db->prepare("SELECT * FROM users WHERE id = ?");</code>

? 充當資料的佔位符。

  1. 資料綁定:然後將資料單獨發送:
<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn