PDO准备声明:我们需要逃脱吗?

时间:2010-09-20 09:55:52

标签: pdo prepared-statement escaping

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参数没有事先处理过)?

提前致谢, MEM

2 个答案:

答案 0 :(得分: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参数,一切都是安全的。

使用上面的示例,没有未转义的输入,因此您是安全的。

答案 1 :(得分:0)

  

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

我想知道您创建的变量不应该被转义,因为您知道他们正在做什么。

仅从用户获取转义内容,例如$ _COOKIE,$ _POST,$ _GET和其他参数,例如网址。