我希望使用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注入保护的担忧。
我在这里做错了吗?我怎样才能确保我的代码安全?
答案 0 :(得分:1)
重读了DBAL文档,我遇到了这个宝石:
如果没有为任何参数绑定方法指定一个整数(通过PDO :: PARAM *常量)而是一个字符串,Doctrine DBAL会要求类型抽象层将传递的值从PHP转换为数据库表示。
因此,如果不定义$types
参数,则将其留给Doctrine以显式转换类型。
但这有多安全?在描述“在您的查询中包含”用户输入“的”正确“方式时,Doctrine会这样说:
除了绑定参数,您还可以传递变量的类型。这允许Doctrine或底层供应商不仅可以转义,还可以将值转换为正确的类型。
从安全角度建议$types
参数是可选的。