ThinkPHP默认不防SQL注入,需手动使用参数绑定或白名单校验。where()传字符串、query()原生执行、IN查询未动态占位、order()等结构参数未校验均会导致注入风险。

ThinkPHP 默认不防 SQL 注入——只要你手动拼接字符串,框架就完全放弃防护。安全不是默认开启的开关,而是你每次写 where()、query()、order() 时主动选择的路径。
where() 接字符串就是裸奔
很多人误以为加了单引号或双引号就安全,比如 where("name = '" . input('name') . "'") 或 where('status = ' . input('status'))。PHP 解析后变量直接嵌入,攻击者传 admin' OR '1'='1 就能闭合引号、注入逻辑。
-
where()接字符串时,ThinkPHP 不走 PDO 预处理,而是调用parseWhere()做纯文本替换 - 接数组才触发参数绑定:
where(['name' => input('name'), 'status' => 1]) - 接闭包也安全:
where(function ($q) { $q->like('name', input('q')); }) - 模糊查询别手拼:
['like', '%' . input('q') . '%']✅,"name LIKE '%{$q}%'"❌
query() 和 execute() 从不自动绑定
Db::query() 和 Db::execute() 是原生 SQL 入口,框架不会帮你加占位符、也不会过滤变量。传进去什么,数据库就执行什么。
- 危险写法:
Db::query("SELECT * FROM user WHERE id = " . input('id')) - 安全写法(位置占位):
Db::query("SELECT * FROM user WHERE id = ?", [input('id')]) - 安全写法(命名占位):
Db::query("SELECT * FROM user WHERE name = :name", [':name' => input('name')]) - 别混用:
Db::query("...", [1, ':name' => 'a'])中的1不会被绑定,':name'也因索引数组被忽略
IN 查询不能直接 bind 数组
把一个 PHP 数组直接传给 bind() 或问号占位符,ThinkPHP 会把它当单个值处理,生成类似 WHERE id IN ('1,2,3') 的非法 SQL,既报错又绕过防护。
- 正确做法是动态生成占位符:
$ids = [1,2,3]; $in = str_repeat('?,', count($ids) - 1) . '?'; Db::query("SELECT * FROM user WHERE id IN ($in)", $ids); - 更省心的是用链式:
Db::name('user')->where('id', 'in', $ids)->select(),内部已做 IN 占位展开 - 空数组必须提前判断,否则
IN ()触发语法错误 - 字段名/表名绝不能来自用户输入;若必须动态,只允许白名单校验:
in_array($table, ['user', 'order']) ?: die();
order()、group()、having() 同样危险
这些方法如果接收用户输入的字符串,比如 order(input('sort') . ' ' . input('dir')),攻击者可传 id; DROP TABLE user-- 或 name ASC, (SELECT ...),直接执行任意语句。
- 排序字段必须硬编码或白名单:
$allowed = ['id', 'name', 'create_time']; $field = input('sort'); $field = in_array($field, $allowed) ? $field : 'id'; - 方向只能是
ASC或DESC,强制校验:$dir = strtoupper(input('dir')) === 'DESC' ? 'DESC' : 'ASC'; - 别试图用
addslashes()或正则“过滤”字段名——它根本挡不住多字节绕过和语法嵌套 - ThinkPHP 不会对这些方法做任何绑定,因为它们属于 SQL 结构部分,不是数据
最易被忽略的点:whereRaw()、havingRaw()、exp() 这类方法,文档里叫“高级用法”,实际是关闭所有防护的快捷键。只要用了,你就得自己承担整个 SQL 字符串的安全责任——包括引号闭合、注释截断、编码歧义。别为了一行“看起来简洁”的代码,把整张表暴露出去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











