不能。ThinkPHP5.0的default_filter配置对防SQL注入基本无效,因其仅作用于输出转义和部分输入过滤,不介入SQL构建过程,无法防御exp表达式直拼、宽字节注入等漏洞;应升级版本、禁用数组嵌套结构、使用白名单校验及预处理绑定。

不能。ThinkPHP5.0 的 default_filter 配置(如设为 'htmlspecialchars,addslashes')对防止 SQL 注入基本无效,甚至会产生误导。
default_filter 的作用对象是输出和字符串转义,不是 SQL 构建过程
该配置仅影响通过 I() 或未显式指定过滤器的输入获取行为,底层调用的是 htmlspecialchars() 或 addslashes() 等函数,它们:
- 对数字型参数(如
id=123)无实际过滤效果; - 对数组型输入(如
['username' => ['exp', 'UPPER(1)']])完全不处理——这正是 5.0.13–5.0.15 中 SQL 注入漏洞的触发点; -
addslashes()无法防御预编译绕过、宽字节注入或框架内生的表达式直拼逻辑。
SQL 注入发生在查询构造阶段,而非输入接收阶段
ThinkPHP 的 SQL 注入风险核心在于 parseData() 等内部方法如何解析用户传入的数据结构。例如:
- 当使用
Db::table()->insert($data)且$data['name'] = ['exp', 'MD5(\'admin\')']时,框架会直接拼接MD5('admin')到 SQL 中,default_filter根本不介入这一流程; - Query Builder 的
where()、order()、field()等方法若接受用户控制的字段名或表达式,default_filter也无能为力。
真正有效的防护手段
应放弃依赖 default_filter 防 SQL 注入,转而采用以下方式:
立即学习“PHP免费学习笔记(深入)”;
- 升级至 ThinkPHP 5.0.25+ 或 5.1.40+,官方已修复
parseData()中对exp结构的字段名校验缺陷; - 批量插入时禁用数组嵌套结构,只传标量值(字符串、整数),杜绝
['field' => ['exp', ...]]形式; - 必须动态构造 SQL 时,改用
whereRaw()+ 手动绑定参数,或Db::query()配合?占位符; - 对所有用户可控的字段名、表名、排序字段等,严格使用白名单校验(
in_array($key, $allowFields)); - 关闭
app_debug = false,避免错误信息泄露数据库结构。
靠 default_filter 挡 SQL 注入,就像用窗帘防子弹——它解决的是 XSS 和部分 HTML 输出问题,不是数据库安全问题。



















