透過參數化查詢來防止 SQL 注入:問號方法
參數化查詢(在 SQL 中以問號 (?) 表示)是針對 SQL 注入漏洞的重要防禦措施。 在程式中動態建構和執行 SQL 語句時,這些查詢至關重要。
參數化查詢相對於手動建構查詢的核心優勢在於增強的安全性。 資料庫處理參數插入,自動應用必要的轉義機制來防止惡意程式碼注入。 考慮這個易受攻擊的範例:
<code class="language-sql">string s = getStudentName(); cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"; cmd.Execute();</code>
如果使用者輸入:Robert'); DROP TABLE students; --
產生的查詢容易受到攻擊。
解決方案涉及使用參數化查詢:
<code class="language-sql">s = getStudentName(); cmd.CommandText = "SELECT * FROM students WHERE name = ?"; cmd.Parameters.Add(s); cmd.Execute();</code>
該庫現在會清理輸入,使惡意程式碼變得無害:查詢實際上變成 "SELECT * FROM students WHERE name = 'Robert''); DROP TABLE students; --'"
— 注入的程式碼被視為文字文字。
雖然問號是廣泛使用的佔位符,但其他資料庫系統(例如 MS SQL Server)利用命名參數(例如 @varname
)來提高可讀性:
<code class="language-sql">cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"; cmd.Parameters.AddWithValue("@varname", 7); result = cmd.Execute();</code>
這種方法具有相同的安全優勢,並且具有更清晰的參數識別。
以上是帶問號的參數化查詢如何防止SQL注入攻擊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!