【问题标题】:Disable multiple statements in PHP PDO在 PHP PDO 中禁用多个语句
【发布时间】:2016-07-11 10:52:49
【问题描述】:

有没有办法在 PDO 中禁用多个语句查询?一种适用于所有支持的驱动程序的方法?

或者,是否有任何众所周知的过滤器可以检测字符串中的多个语句?

我知道prepared statements可以更好地防止SQL注入风险,在这种情况下我不能使用它们是有原因的。

【问题讨论】:

  • 抛开正则表达式或模拟查询,我认为你仍然应该使用准备好的语句,否则鲍比可能会生气。 bobby-tables.combobby-tables.com/php.html。为什么你不能使用它们?你能解释一下这背后的背景吗?
  • 相信我,整个场景真的太复杂了,无法在这里用几句话来解释。鲍比不会生气。举个极端的例子:假设用户被允许在表单中编写并执行任意查询。这里没有参数,即没有准备好的语句方法,对吧?是否可以防止多个语句?
  • 如果允许用户写任何东西,他们为什么要关心多个语句?为什么不在允许他们的单一语句中写他们想要的任何东西?
  • 不能使用prepared statements的原因是什么?
  • 您到底想达到什么目的?您已将问题标记为安全,这与您的问题有什么关系?

标签: php security pdo


【解决方案1】:

你在吠叫错误的树。

Multiple 语句不是 SQL 注入的同义词。它只是一个子集,一个非常小的子集,在 zilliards 其他可能的利用注入的方法中。

因此你应该防止注入,而不是多重声明。为此,发送到数据库 API 的查询必须在您的脚本中 100% 硬编码。为此,请始终用占位符替换查询中的所有变量。

【讨论】:

  • 抱歉,我认为你的论点没有逻辑。
  • 好吧,如果你没有看到逻辑忘记我需要它的原因;我的问题是一个非常干净和简单的编程问题:是否可以在 PDO 中禁用多个语句或过滤它们?
  • 很抱歉,我们在这里只回答明智的问题。
  • Stack Overflow 不是满足您一时兴起的个人帮助台。它的使命是积累对许多人有用的知识。你的问题显然对其他人没有实际价值。
  • @Eugenio:他的意思是这样做毫无意义。你的问题的答案在他回答的最后一句话:a query that is sent to database API have to be 100% hardcoded in your script。而已。无论您为避免“多重陈述”付出了多少努力,您仍然会面临可能的注射。手动硬编码查询(提取用户提供的查询并检查它,然后从中创建一个查询),不允许用户在不检查他正在尝试做什么的情况下执行查询。
【解决方案2】:

是的,有一种方法可以禁用多语句查询,至少对于 PDO MySQL,您可以使用 PDO::MYSQL_ATTR_MULTI_STATEMENTS 常量 [1,2];该常量自 PHP 5.5.21 和 PHP 5.6.5 起存在。

我已经为 PostgreSQL、SQLite 和 MS SQL Server 寻找了一个等价物,但我没有找到它。但是,根据我的测试,PDO PostgreSQL 和 SQLite 不允许多语句查询,而 pdo_sqlsrv 允许。不过,我还没有找到有关此的官方文档,因此它可能取决于我的驱动程序版本或其他因素。

参考资料:

[1]http://php.net/manual/en/ref.pdo-mysql.php

[2]https://bugs.php.net/bug.php?id=68424

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 2014-04-19
    • 2012-03-12
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多