You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:58:25