Symfony中Doctrine Query的execute方法是否存在SQL注入风险?
SQL注入风险分析:参数绑定的安全性
代码片段:
$query = $this->em->createQuery( "SELECT client FROM App\Entity\Gescom\Client client WHERE client.name LIKE CONCAT('%', :query, '%')" ) ->setFirstResult(($request->get('page') - 1) * $request->get('page_limit')) ->setMaxResults($request->get('page_limit')); $query->execute([ 'query' => $request->get('q') . '%' ]);
这段代码不存在SQL注入风险,核心原因是使用了Doctrine的参数化查询机制:
- 你定义的DQL语句用了命名参数
:query,execute()方法传入的参数会被Doctrine做参数绑定处理。数据库会先编译DQL对应的SQL模板,再将参数值作为纯字符串字面量代入执行,完全不会把参数内容解析为SQL语法的一部分。 - 哪怕你在参数值里拼接了
%,这个%也只是作为LIKE查询的通配符存在,属于业务逻辑范畴,不会触发SQL注入。Doctrine会把$request->get('q') . '%'整个当作一个完整的参数值传递,恶意输入无法突破参数边界篡改SQL结构。 - 要区分开参数绑定和直接字符串拼接的差异:如果是把用户输入直接拼进DQL字符串(比如
"SELECT ... LIKE '%{$request->get('q')}%'"),那才会有注入风险,而参数绑定从根源上杜绝了这种问题。
额外提醒:代码中的分页参数page和page_limit直接使用了请求原始值,建议添加整数校验逻辑,避免非整数输入导致的运行异常,但这不属于SQL注入问题范畴。
内容的提问来源于stack exchange,提问作者Matthieu
相关产品推荐
相关产品推荐

