为什么使用 mysql 预准备语句比使用常见转义函数更安全?

在另一个问题中有一条评论,内容如下:

“当涉及到数据库查询时,请始终尝试使用准备好的参数化查询。mysqli和PDO库支持这一点。这比使用转义函数(如mysql_real_escape_string“)安全得多。

所以,我想问的是:为什么准备好的参数化查询更安全?


答案 1

我认为这里的人缺少的一点是,对于支持参数化查询的数据库,无需担心“转义”。数据库引擎不会将绑定变量合并到SQL语句中,然后解析整个内容;绑定变量保持独立,从不作为通用 SQL 语句进行分析。

这就是安全性和速度的来源。数据库引擎知道占位符仅包含数据,因此永远不会将其解析为完整的 SQL 语句。当您准备一个语句一次,然后多次执行它时,就会加速;规范示例是将多个记录插入到同一个表中。在这种情况下,数据库引擎只需要解析、优化等一次。

现在,一个问题是数据库抽象库。他们有时只是通过将绑定变量插入到具有正确转义的SQL语句中来伪造它。不过,这比自己动手要好。


答案 2

首先,您将危险字符的转义留给数据库,这比您人类要安全得多。

...它不会忘记转义,也不会错过任何可用于注入恶意SQL的特殊字符。更不用说,您可能会获得性能改进来启动!


推荐