通过参数化查询防止 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中文网其他相关文章!