准备好的语句:针对 SQL 注入的稳健防御(第 2 部分)
准备好的语句提供了一种预防 SQL 注入的主动方法。 他们通过将用户提供的数据与 SQL 查询结构分离来实现这一点。 准备好的语句不是将用户输入直接嵌入到查询字符串中,而是使用参数(通常表示为问号 (?))作为占位符。
数据库引擎在添加用户数据之前解析并编译准备好的语句。 这一关键步骤可确保用户输入仅被视为数据,从而防止将其解释为可执行 SQL 代码。这与直接将用户输入连接到 SQL 字符串的易受攻击的方法形成鲜明对比。
说明性示例:考虑将用户数据插入数据库。
易受攻击的字符串连接:
<code class="language-java">PreparedStatement stmt = conn.createStatement("INSERT INTO students VALUES('" + user + "')"); stmt.execute();</code>
安全准备好的声明:
<code class="language-java">PreparedStatement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)"); stmt.setString(1, user); stmt.execute();</code>
如果恶意用户输入:Robert'); DROP TABLE students; --
字符串连接方法的结果是:
<code class="language-sql">INSERT INTO students VALUES('Robert'); DROP TABLE students; --')</code>
这将执行恶意DROP TABLE
命令。
但是,使用准备好的语句,数据库执行:
<code class="language-sql">INSERT INTO student VALUES('Robert');</code>
恶意输入被视为文字数据,从而消除了 SQL 注入威胁。 准备好的语句有效地将查询逻辑与潜在有害的用户输入隔离,从而保证 SQL 命令的完整性。
以上是准备好的语句如何防止 SQL 注入?的详细内容。更多信息请关注PHP中文网其他相关文章!