Doctrine中EntityRepository::matching()搭配Criteria如何绑定参数
Doctrine Criteria查询安全问题解答
首先直接给出结论:你示例中的代码本身就是安全的,无需额外修改。
核心疑问解答
- 通过
EntityRepository::matching()执行的所有查询都会自动完成参数绑定,不会存在SQL注入风险。 - 你觉得没有参数绑定入口是因为
Criteria的设计本身就做了封装:你调用Criteria::expr()->eq()/andWhere()这类方法时传入的参数值,会被底层自动分离存储,最终生成SQL时会替换为预处理占位符,再自动绑定对应参数值,不会直接拼接进SQL语句。
注意事项
- 只有当你主动将用户输入的内容拼接成SQL条件字符串传入
Criteria时,才会产生安全隐患,只要你始终使用Criteria::expr()提供的表达式方法传入参数值,就无需额外处理安全问题。 - 如果后续遇到
Criteria无法满足的复杂查询,需要手写DQL或者原生SQL时,才需要你手动调用setParameter()方法绑定用户输入的参数,规避注入风险。
内容的提问来源于stack exchange,提问作者R. Gustaf
相关产品推荐
相关产品推荐

