Php 转义pdo查询,有必要吗?

Php 转义pdo查询,有必要吗?,php,mysql,pdo,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; 整个脚本可在上找到。 有人

我今天的问题是。我需要在脚本中转义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;
整个脚本可在上找到。

有人能解释一下为什么我现在需要逃跑,或者为什么不需要


我很高兴收到你的来信,非常感谢

首先,你需要明白,你所使用的“逃避”这个词是没有意义的

您可能的意思是“使您的查询不受SQL注入的影响”。但是,不幸的是,并没有这种神奇的“转义”可以使某些抽象查询变得安全

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

$query = 'SELECT col1, col2 FROM some_table WHERE id = ?';
$stmt = $dbh->prepare($query);
$stmt->execute([$id]);
$row = $stmt->fetch();
这种查询被认为是安全的

在动态构造的查询中,每个部分都有可能受到攻击。

在这里,理解清理所有查询部分的负担完全在这个函数上是非常重要的。你不能简单地宣称你的数据来自可信的来源就消除这种危险。那是一块很滑的场地,因为

所以,如果你的问题是“我必须保护这段代码不受SQL注入的影响吗”,那么答案是-是的,你必须

同时,您只保护查询的一小部分—数据值。所以你仍然需要保护(这个术语比“逃逸”好得多)所有其他部分


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

查询的动态部分是表名和列名。不能对查询的这些部分使用绑定函数。绑定函数只能用于SQL查询中可能是简单值的查询部分。类似于数字常量、带引号的字符串或带引号的日期文字

要避免动态表名或列名的SQL注入,您可以选择以下选项:

  • 使用在类中预定义的值,或确保安全的值。不要使用来自用户或任何其他来源的外部内容
  • 使用转义。请注意,函数
    PDO::quote()
    不会执行表名或列名所需的转义
  • 创建一个包含已知表名和相应表的列名的“allowlist”,并将动态输入与allowlist进行比较。如果它与allowlist不匹配,则引发错误

您应该转义任何不可信的数据<代码>$foo=“bar”可以信任,因为您是设置它的人(并且它不能被重写)<代码>$\u GET['foo']可以是任何东西,所以不要相信它!我逃避不受信任的数据,而不是所有的数据。PDO自动处理的唯一一件事是准备好的语句参数,这些参数用
bindParam/bindpalue
填充“因为PDO大部分时间都在处理这些问题。”---你最好不要这样对待它。PDO只是一种工具。它不会使任何东西自动安全。你仍然必须理解应该如何做,应该做什么。你需要阅读我提到的文章,首先了解威胁。