PDO的安全性选择查询?

时间:2016-06-14 10:03:23

标签: php mysql pdo fetch prepare

有人可以帮我解决问题吗?

我目前正在将所有旧的PHP代码转换为使用PDO。 我想知道何时需要为我的查询使用预备功能?

我目前有这个查询。

    $sql = "SELECT deckName FROM decks WHERE deleted = '0' ORDER by deckName";

除了已删除的列之外,它们都不是动态的。 我正在使用下面的内容在屏幕上重申我的数据。

   foreach($DBH->query($sql) as $row){ echo $row['deckName']?> }

我是否仍然将此作为良好做法或上述是否足够好?

   $sth = $DBH->prepare("SELECT deckName FROM decks WHERE deleted = '0' ORDER by deckName");

我不太确定如何在重复行中的数据时正确使用fetch语句?

提前致谢:) 海莉

1 个答案:

答案 0 :(得分:0)

如果您向数据库发送一个常量字符串并且从不混合使用“不受信任的输入”,那么我认为安全问题无关紧要,只有潜在的性能方面仍然存在,这取决于底层数据库。如果一个昂贵的解析查询的准备步骤可以在第一个之后的所有调用的执行阶段(prepare,bind = NOOP here,e​​xecute)中得到保留。

因此,从标签中猜测,您使用mysql并且不使用memcached等作为中间层,您可能只想测量性能,否则您可以迁移到直接查询。

当“Project”稍后需要查询的变量参数化时(基于不受信任的输入,例如来自网络),您应该再次使用prepare来屏蔽注入攻击。也许那么找出“如何在重复行中的数据时正确使用fetch语句”会很好......“

修改答案以容纳“大写的nevers”,以便在评论的查询中使用变量:

有一个实际的理由让我写“接受不受信任的输入”而不是“从不这样,从不这样”。根据我的经验,当涉及到变量时,有一个很滑的斜率:在上面的问题中没有审计$ sql变量的更广泛的上下文 - 甚至整个查询也可能是注入攻击的可能性。 此外,从常量构建查询字符串的内部重构可能会导致混合其他变量以组成充当查询的(更复杂的)字符串。

为了更加平衡/差距最小化硬化,我建议:

  1. 在实现应用程序的代码中记录一个说“可信边界”的特定地图,并在此基础上,对跨越这些边界的任何输入实施严格验证 - 即传输价值的变量 - 在大多数情况下是有效的,高效。

  2. 当“输入”(越过边界)被“注入”作为参数时,添加分层安全性/关注点分离的常识概念自然会导致使用预备语句。

  3. 当我像处理基于数据库的网络应用程序那样处理像应用程序堆栈这样的scyscraper时,我不愿发布简单的配方,给出乐观的安全感。