在 PDO::Prepare 页面上指出,
“并且无需手动引用参数,有助于防止 SQL 注入攻击”
知道了这一点,是否有像 mysql_real_escape_string() 这样的 PHP 函数可以处理 PDO 的转义问题?或者 PDO 会帮我处理所有的逃生吗?
编辑
我现在意识到我问错了问题。我的问题实际上是:“PDO 为我提供什么服务?”我现在通过这些答案意识到,它实际上只是消除了转义引号的需要。但我仍然需要对传递给执行函数的值执行任何其他 PHP 清理调用。比如htmlentities(), strip_tags()...等等...
PDO 不会转义变量。变量和 SQL 命令通过 MySQL 连接独立传输。并且 SQL 标记器(解析器)从不查看值。值只是逐字复制到数据库存储中,不可能造成任何损害。这就是为什么不需要使用准备好的语句转义数据。
如果你连接 SQL 命令并且实际上没有使用准备好的语句(不好!),那么是的,PDO 有一个用于 strings,$pdo->quote($string) 的格式化函数,它将你的字符串放在引号中并在里面转义这些引号(以及一些其他字符)。
这里很少有人了解转义是什么以及何时使用它。
转义本身并不会使任何数据变得“安全”。它只是转义分隔符,以区分分隔符和数据的一部分。
field = 'it's me'
会导致错误,而 field = 'it\'s me'
则不会。这就是逃跑的唯一目的。因此,仅当您使用引号时它才有效。如果你不这样做——逃避就变得毫无用处。
您是否使用带占位符的引号?不。因此,逃避是不明智的。
当您绑定变量时,它的工作方式非常不同:它不会将整个查询发送到服务器,而是发送与绑定数据分开的准备好的查询。所以它不能干涉。因此无法进行注射。
是与否:
您不必担心。 PDO 不要求您在将数据传递到数据库之前转义数据。
编辑: 需要明确的是,我的意思是只要您将变量传递到参数中(例如,表单字段的值),您就不必担心它。但是,例如,如果您传递定义为字符串的变量,那么显然您需要转义该字符串中需要转义的任何内容,以避免破坏语法。然而,这甚至没有多大意义,因为 PDO 的主要优点之一是您将信息从用户传递到数据库,而不必自己清理它,并且没有很多次(如果有的话?)您将传递您自己定义的字符串。
此外,请确保您仍然清理type的数据。例如,如果您希望它是整数,请确保它是整数;如果您希望它是整数,请确保它小于或大于 x,等等。