PHP Yii2框架中使用andFilterWhere函数如何防范SQL注入
Yii2 andFilterWhere LIKE查询防SQL注入方案
一、当前写法已经具备SQL注入防护能力
你使用数组格式传递查询条件给andFilterWhere()时,Yii2底层会自动完成参数绑定,不会直接拼接用户输入到SQL语句中,防护逻辑和你看到的官方:status参数绑定示例完全一致。
你给出的代码最终生成的SQL片段会类似:
live_list_data.original_roamer_request_id LIKE :qp1
其中:qp1会由Yii2自动绑定你传入的$pattern变量,完全不存在SQL注入风险,不需要额外修改即可正常使用。
二、LIKE场景手动参数绑定写法(对应官方示例格式)
如果你需要手写字符串格式的查询条件,可以参考如下写法适配LIKE场景:
$query = new Query(); // 通配符%添加到绑定参数值中,不要写在SQL字符串里 $query->andFilterWhere( LiveListData::tableName() . '.originalRoamerRequestId LIKE :pattern', [':pattern' => '%' . $pattern . '%'] );
三、额外业务注意事项:LIKE通配符转义
上述两种方案仅解决SQL注入问题,如果你的业务不希望用户输入的%、_等SQL LIKE专用通配符生效(比如用户输入test%时,你只想匹配实际包含test%字符串的记录,而非所有test开头的记录),需要手动转义用户输入的特殊字符:
// 转义通配符 $safePattern = str_replace(['%', '_'], ['\%', '\_'], $pattern); // 再传入查询条件 $query->andFilterWhere( [ 'like', LiveListData::tableName() . '.originalRoamerRequestId', $safePattern ] );
内容的提问来源于stack exchange,提问作者Even Zhi
相关产品推荐
相关产品推荐

