CodeIgniter数据库类默认安全,但需正确使用:优先用Query Builder自动转义,原生SQL必须绑定参数,禁用全局XSS过滤和手动escape,关闭db_debug,配合最小数据库权限与WAF加固。

CodeIgniter 自带的数据库类已内置多层防护机制,但是否真正安全,取决于你如何使用它。默认开启的查询绑定和自动转义功能,能覆盖绝大多数注入场景;但若绕过框架封装、直接拼接SQL或误用原生查询,风险依然存在。
优先使用 Query Builder(查询构造器)
CodeIgniter 的 $this->db->select()->where()->get() 等链式方法,默认采用参数化逻辑,所有用户输入都会被自动转义并作为数据绑定处理:
- 例如:
$this->db->where('username', $user_input)->get('users')—— 即使$user_input是"admin' OR 1=1 --",也不会触发注入 - 模糊搜索也安全:
$this->db->like('name', $keyword)->get('users'),框架内部已对通配符和引号做双重处理 - 批量操作如
insert_batch()、update_batch()同样受保护,无需手动转义
原生查询必须用 query() + 绑定参数
当必须写原生 SQL(如复杂 JOIN 或子查询),绝不能字符串拼接。CodeIgniter 支持两种安全绑定方式:
- 问号占位符:
$this->db->query("SELECT * FROM users WHERE status = ? AND role = ?", [$status, $role]); - 命名参数:
$this->db->query("SELECT * FROM logs WHERE user_id = :id AND action = :act", ['id' => $uid, 'act' => $action]); - 注意:绑定只对 值 生效;表名、字段名、ORDER BY 等动态结构不支持绑定,需通过白名单校验(如
in_array($sort_field, ['name', 'email', 'created_at']))
禁用危险配置与手动转义陷阱
CodeIgniter 默认关闭 escape_str() 的全局自动调用,但开发者有时会误用:
- 避免手动调用
$this->db->escape()后再拼接到 SQL 中 —— 这容易因遗漏或重复导致双转义或漏转义 - 确认
$config['global_xss_filtering']未启用(CI 3.x 已弃用,CI 4.x 完全移除),XSS 过滤不解决 SQL 注入,反而干扰正常数据 - 关闭数据库调试模式:
$db['default']['db_debug'] = FALSE;,防止错误信息泄露表结构或字段名
配合最小权限与运行时加固
框架层防护只是第一道关卡,还需底层协同:
- 数据库连接账号仅授予
SELECT, INSERT, UPDATE权限(如只需读取,就禁用DELETE和DROP) - 在 CI 的数据库配置中设置
'compress' => TRUE和'failover' => []可间接提升连接稳定性,减少因异常中断引发的逻辑绕过 - 结合 Web 应用防火墙(WAF)规则,拦截含
UNION SELECT、information_schema、EXEC等高危关键词的请求

















