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

时间:2010-06-29 18:27:12

标签: php pdo

在它所说的PDO::Prepare page上,

  

“并且通过消除手动引用参数”

来帮助防止SQL注入攻击

知道这一点,是否有像mysql_real_escape_string()这样的PHP函数来处理PDO的转义?或者PDO是否会为我解决所有问题?

修改

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

5 个答案:

答案 0 :(得分:26)

PDO不会逃避变量。变量和SQL命令通过MySQL连接独立传输。并且 SQL tokenizer(解析器)从不查看值。值只是逐字复制到数据库存储中,不会造成任何伤害。这就是为什么没有必要用准备好的陈述来编组数据。

请注意,这主要是速度优势。使用mysql_real_escape_string(),您首先在PHP中编组变量,然后将低效的SQL命令发送到服务器,这需要将实际的SQL命令与值再次隔离开来。这就是为什么人们经常说安全优势只是隐含的,而不是使用PDO的主要原因。

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

答案 1 :(得分:8)

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

您是否在占位符中使用引号?不,因此,没有逃避是明智的。

使用绑定时,它的工作方式非常不同 它不会将整个查询发送到服务器,而是将准备好的查询与绑定数据分开发送。所以它不能干涉。因此无法注射。

答案 2 :(得分:7)

是和否:

  • 您嵌入到语句字符串中的文字需要正常转义。
  • 绑定到预准备语句的值由库处理。

答案 3 :(得分:4)

如果您准备一个语句并使用bindParambindValue来提供变量,则无需转义变量。请注意,这些函数假定变量包含一个字符串,因此如果要使用布尔值或浮点数,请使用第三个参数bindValue。

答案 4 :(得分:1)

你不必担心它。在将数据传递到数据库之前,PDO不要求您转义数据。

编辑:为了清楚起见,我的意思是说,只要您将变量传递给参数(例如,表单字段的值),您就不必担心它。但是,例如,如果您传递的是已定义为字符串的变量,那么显然您需要转义在该字符串中需要转义的任何内容,以避免破坏语法。然而,这甚至没有多大意义,因为PDO的一个主要优点是您将信息从用户传递到数据库而无需自己清理它,并且没有多少次(如果有的话)?您将传递您自己定义的字符串。

此外,请确保您仍然清理类型的数据。例如,如果您希望它是一个整数,请确保它是一个整数,如果您期望它,请确保它小于或大于x等。

相关问题