逃避pdo查询,是否有必要?

时间:2016-09-01 23:45:48

标签: php mysql pdo

我今天的问题是。我需要在脚本中转义PDO吗?

$columns = implode(", ",$column);
$query = ''.$query.' '.$columns.' FROM '.$table.'';
$dbh_query = $dbh->prepare($query);
$dbh_query->execute();
$dbh_querys = $dbh_query->fetchAll();

return $dbh_querys;

整个脚本可以在。 https://github.com/joshuahiwat/crud/blob/master/control/query_connector.class.php

有人可以解释为什么我此时需要逃跑或为什么不逃避。

我很想听到你的消息,非常感谢!

2 个答案:

答案 0 :(得分:3)

查询中的动态部分是表名和列名。您不能对查询的这些部分使用绑定函数。绑定函数只能用于查询的部分,否则它们将成为SQL查询中的简单值。像数字常量,或带引号的字符串或引用的日期文字。

为避免从动态表名或列名注入SQL,您有以下选择:

  • 使用您班级中预定义的值,或者确定是安全的。请勿使用用户或任何其他来源的外部内容。
  • 使用转义。请注意,函数PDO::quote()不会执行表名或列名所需的转义。
  • 创建"白名单"已知表名称和相应表的列名称,并将动态输入与白名单进行比较。如果它与白名单不匹配,则引发错误。

答案 1 :(得分:2)

首先,您需要了解您正在使用的单词 - " escape" - 毫无意义。

你可能意味着"使你的查询免于SQL注入"。但是,不幸的是,没有这样的魔法"逃避"这将使一些抽象查询安全。

传统的查询构建假设数据值旁边的所有查询部分都是硬编码的,而数据值是通过占位符绑定的,如下所示:

$query = 'SELECT col1, col2 FROM some_table WHERE id = ?';
$stmt = $dbh->prepare($query);
$stmt->execute([$id]);
$row = $stmt->fetch();

这种查询被认为是安全的。

对于动态构造的查询,每个部分都可能存在漏洞。

这里非常重要的是要理解清理所有查询部分的负担完全取决于此功能。您不能仅仅因为声称您的数据来自可靠来源而忽略了危险。这是一个很滑的地方,因为people often have no idea whether their source is trusted or not

所以,如果你的问题是"我是否必须保护这段代码免受SQL注入",答案是 - 是的,你有。

与此同时,您只保护查询的一小部分 - 数据值。所以你仍然需要保护(这个术语比#34;逃避"更好)所有其他部分。

另外,您的代码每次运行查询时都会连接到数据库,这样效率非常低,并且无法使用某些数据库功能。