【问题标题】:PDO prepare statements: Do we need to escape?PDO 准备语句:我们需要逃跑吗?
【发布时间】:2010-09-20 09:55:52
【问题描述】:
public function receiveDomainNames($keyword)
{
  try
  {
    $stmt = $this->_dbh->prepare("SELECT d.someField FROM domain d WHERE d.someField LIKE :keyword");
    $someField = '%'.$keyword.'%';

在这种情况下我们需要转义 $keyword 吗?

在php手册上我们可以阅读:

如果应用程序专门使用准备好的语句,开发人员可以 确保不会有 SQL 注入 发生(但是,如果其他部分 查询正在建立 未转义的输入,SQL 注入是 仍然可能)。

您认为是这种情况吗,在这种情况下,是否建立了非转义输入(没有对我们的 $keyword 参数进行事先处理)?

提前致谢, 内存

【问题讨论】:

  • 实际上,我在 $keyword 参数上使用了带有 FILTER_SANITIZE_STRING 的 filter_input(在他到达这里之前) - 所以我相信那里不需要转义?

标签: pdo prepared-statement escaping


【解决方案1】:

鉴于上述 SQL 语句,我认为没有合理的 SQL 注入可能性。

关于“其他部分”的警告将是如下 SQL 查询:

$binds = array(":id"=>$_GET['id']);
$myPDO->prepare("SELECT {$_GET['columns']} FROM {$_GET{['table']} WHERE id = :id");
$statement = $myPDO->execute($binds);

这个例子是他们意思的最坏情况/明确的例子,天真地有人可能会认为,因为他们正在逃避 where 参数,所以一切都是安全的。

在上面的示例中,没有未转义的输入,因此您很安全。

【讨论】:

    【解决方案2】:

    如果应用程序专门使用预准备语句,则开发人员 可以确定不会发生 SQL 注入(但是,如果其他 查询的一部分是用未转义的输入 SQL 构建的 注入仍然是可能的)。

    我认为你创建的变量不应该被转义,因为你知道它们在做什么。

    仅转义用户获取的内容,如$_COOKIE、$_POST、$_GET和URL等其他参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      相关资源
      最近更新 更多