1

我正在寻找使用 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

但是,代码也可以使用以下行(其中类型参数声明不正确或根本未声明):

$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 注入保护的担忧。

我在这里做错了吗?如何确保我的代码是安全的?

4

1 回答 1

1

重读 DBAL 文档后,我发现了这个 gem:

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

因此,通过不定义$types参数,您将其留给 Doctrine 来显式转换类型。

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

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

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

于 2015-03-25T21:13:33.527 回答