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

问题描述 投票:0回答:5

PDO::Prepare 页面上指出,

“并且无需手动引用参数,有助于防止 SQL 注入攻击”

知道了这一点,是否有像 mysql_real_escape_string() 这样的 PHP 函数可以处理 PDO 的转义问题?或者 PDO 会帮我处理所有的逃生吗?

编辑

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

php pdo
5个回答
28
投票

PDO 不会转义变量。变量和 SQL 命令通过 MySQL 连接独立传输。并且 SQL 标记器(解析器)从不查看值。值只是逐字复制到数据库存储中,不可能造成任何损害。这就是为什么不需要使用准备好的语句转义数据。

如果你连接 SQL 命令并且实际上没有使用准备好的语句(不好!),那么是的,PDO 有一个用于 strings$pdo->quote($string) 的格式化函数,它将你的字符串放在引号中并在里面转义这些引号(以及一些其他字符)。


14
投票

这里很少有人了解转义是什么以及何时使用它。
转义本身并不会使任何数据变得“安全”。它只是转义分隔符,以区分分隔符和数据的一部分。

field = 'it's me'
会导致错误,而
field = 'it\'s me'
则不会。这就是逃跑的唯一目的。因此,仅当您使用引号时它才有效。如果你不这样做——逃避就变得毫无用处。

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

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


8
投票

是与否:

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

6
投票

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


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.