PHP PDO 预准备的语句是否需要转义?

2022-08-30 19:37:05

PDO::P repare 页面上,它指出,

“并通过消除手动引用参数的需要来帮助防止SQL注入攻击”

知道了这一点,有没有像mysql_real_escape_string()这样的PHP函数来处理PDO的蜇伤?还是PDO为我照顾了所有逃跑的人?

编辑

我现在意识到我问错了问题。我的问题是,“PDO为我照顾了什么?我现在意识到,有了这些答案,它实际上只是消除了转义引号的需要。但是我仍然需要对我传递给执行函数的值执行任何其他PHP清理调用。如 htmlentities(),strip_tags()...等。。。


答案 1

PDO 不会转义变量。变量和 SQL 命令通过 MySQL 连接独立传输。SQL 分词器(解析器)从不查看值。值只是逐字复制到数据库存储中,而不会造成任何伤害。这就是为什么没有必要使用准备好的语句来编组数据的原因。

请注意,这主要是速度优势。使用mysql_real_escape_string(),您首先在PHP中编组变量,然后向服务器发送低效的SQL命令,这必须花费大量成本将实际的SQL命令与值分开。这就是为什么人们常说安全优势只是隐含的,而不是使用PDO的主要原因。

如果您连接SQL命令并且实际上没有使用预准备语句(不好!),那么是的,PDO仍然有一个转义函数:$pdo->quote($string)


答案 2

这里很少有人了解什么是逃避以及何时使用它。
转义本身并不能使任何数据“安全”。它只是转义分隔符,以区分分隔符和数据的一部分。 将导致错误,而不会。这是逃跑的唯一目的。因此,它仅在使用引号时有效。如果你不这样做 - 逃避变得毫无用处。field = 'it's me'field = 'it\'s me'

是否使用带占位符的引号?不。因此,任何逃避都是明智的。

当您绑定变量时,它的工作方式非常不同:它不会将整个查询发送到服务器,而是将准备好的查询与绑定数据分开发送。所以它不能干涉。因此,不可能进行注射。


推荐