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

Met*_*lis 19 php pdo

PDO :: Prepare页面上,它指出,

"并且通过消除手动引用参数的需要,有助于防止SQL注入攻击"

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

编辑

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

mar*_*rio 26

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

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

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

  • @The Rook:从http://svn.php.net/viewvc/php/php-src/trunk/ext/pdo_mysql/mysql_statement.c?revision=299574&view=markup计算它可能取决于后端驱动程序.新的mysqlnd肯定会使用真正准备好的语句,而旧的可能会回退到PDO_ATTR_EMULATE_PREPARES并转义/连接.毕竟,如果**不可用,它是模仿它的PDO的广告功能之一. (2认同)

You*_*nse 9

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

你是否使用占位符引用?不,因此,没有逃避是明智的.

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


tc.*_*tc. 8

是和否:

  • 嵌入到语句字符串中的文字需要像往常一样进行转义.
  • 绑定到预准备语句的值由库处理.

  • @Patareco传递给PDOStatement :: bindValue()或PDOStatement :: bindParam()的值(有一个重要的区别!)应该由PDO正确处理。您不应该对它们进行转义,否则它们将被转义存储在数据库中。但是,我不做任何保证。PDO / PHP / MySQL中可能存在允许注入的错误。您还必须正确处理输出以防止脚本注入。 (2认同)

Sjo*_*erd 5

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

  • @Metropolis:很好。如果通过问号?或:named参数作为-> execute()的参数,它的作用与bindParam相同。请注意,这些内容应随后引用文本列。 (2认同)