PHP PDO准备的语句是否需要转义?
在PDO :: Prepare页面上,
“并通过不需要手动引用参数来帮助防止SQL注入攻击”
了解这一点,是否有像mysql_real_escape_string()这样的PHP函数来处理PDO的转义响应? 还是PDO照顾所有逃避我?
编辑
我现在意识到我提出了错误的问题。 我的问题确实是,“PDO为我照顾什么?” 我现在认识到,这些答案确实只是避免了引号的需要。 但我仍然需要对传递给execute函数的值进行其他任何PHP清理调用。 如htmlentities(),strip_tags()...等...
PDO不会逃避变量。 变量和SQL命令通过MySQL连接独立传输。 SQL标记器(解析器)从不查看这些值 。 值只是逐字地复制到数据库存储中,而不会造成任何伤害。 这就是为什么不需要用准备好的陈述来编组数据的原因。
请注意,这主要是速度优势。 使用mysql_real_escape_string(),您首先在PHP中编写您的变量,然后向服务器发送低效的SQL命令,而这又必须花费大量的时间从实际的SQL命令中重新分离出实际的SQL命令。 这就是为什么人们经常说安全优势只是隐含的,而不是使用PDO的主要原因。
如果您连接SQL命令并且实际上不使用准备好的语句(不好!),那么是的,PDO仍然有一个转义函数:$ pdo-> quote($ string)
是和否:
这里很少有人能够理解转义是什么以及何时使用它。
逃避本身并不会使任何数据“安全”。 它只是逃避分隔符,以区分一部分数据的分隔符。 field = 'it's me'
会导致错误,而field = 'it's me'
不会。 这是逃脱的唯一目的。 所以,它只适用于使用引号。 如果你不逃避变得无用。
你使用占位符引号吗? 不可以。因此,不可逃脱是明智的。
当你使用绑定时,它的工作方式非常不同。
它不会将整个查询发送到服务器,而是将您准备好的查询与绑定数据分开发送。 所以它不会干涉。 因此没有注射可能。