在Doctrine DBAL中使用executeQuery发出绑定变量类型的问题

时间:2015-03-23 10:31:09

标签: php doctrine-orm dbal

我希望使用Doctrine DBAL函数executeQuery,如下所示:

$conn = DBAL\DriverManager::getConnection($connectionParams, $config);

$sql = "SELECT count(*) FROM clients WHERE client_id = :id";

$results = $conn->executeQuery($sql, ['id' => 'foo'], ['id' => \PDO::PARAM_STR]);

var_dump($results->fetchAll());
var_dump($results->rowCount());

返回工作正常:

array (size=1)
  0 => 
    array (size=1)
      'count(*)' => string '1' (length=1)
int 1

但是代码也可以使用以下行(其中types参数声明不正确或根本没有声明):

$results = $conn->executeQuery($sql, ['id' => 'foo'], ['id' => \PDO::PARAM_INT]);

$results = $conn->executeQuery($sql, ['id' => 'foo'], ['notatag' => \PDO::PARAM_STR]);

$results = $conn->executeQuery($sql, ['id' => 'foo']);

建议声明绑定的变量数据类型没有被使用,引起了对这是否受到SQL注入保护的担忧。

我在这里做错了吗?我怎样才能确保我的代码安全?

1 个答案:

答案 0 :(得分:1)

重读了DBAL文档,我遇到了这个宝石:

  

如果没有为任何参数绑定方法指定一个整数(通过PDO :: PARAM *常量)而是一个字符串,Doctrine DBAL会要求类型抽象层将传递的值从PHP转换为数据库表示。

因此,如果不定义$types参数,则将其留给Doctrine以显式转换类型。

但这有多安全?在描述“在您的查询中包含”用户输入“的”正确“方式时,Doctrine会这样说:

  

除了绑定参数,您还可以传递变量的类型。这允许Doctrine或底层供应商不仅可以转义,还可以将值转换为正确的类型。

从安全角度建议$types参数是可选的。