CodeIgniter安全开发需贯穿全链路:输入层严控外部数据并显式验证,输出层按上下文转义,会话与CSRF双加固,敏感文件隔离存放,禁用PHP解析并清除调试残留。

CodeIgniter 安全开发不是靠“开个开关”就万事大吉,而是贯穿输入、处理、输出、存储、传输全过程的系统性实践。核心原则是:不信任任何外部输入,所有数据默认视为不可信;输出必须按上下文转义;敏感操作必须验证身份与意图。
输入层:严控来源,拒绝裸用全局变量
GET、POST、COOKIE、SERVER、URI 等一切外部输入,都必须经过显式清洗和验证,不能直接读取 $_POST 或 $_GET。
- 优先使用框架封装方法:如
$this->request->getPost('email', FILTER_SANITIZE_EMAIL)(CI4)或$this->input->post('email', true)(CI3),其中true表示启用 XSS 过滤 - 对关键字段做类型+范围双重校验:例如手机号用正则
^1[3-9]\d{9}$,ID 必须为整数且大于 0,邮箱调用filter_var($email, FILTER_VALIDATE_EMAIL) - 禁用全局自动 XSS 过滤(
$globalXSSFiltering = true)——它粗粒度清理易误杀合法内容(如代码片段、富文本),应改为按需、按上下文精细过滤
输出层:动态内容必转义,上下文决定转义方式
未经转义的用户数据直接输出到 HTML/JS/CSS/URL,是 XSS 的主要入口。CI4 的 esc() 函数是标准解法。
- HTML 内容:用
= esc($content, 'html') ?>—— 转义<、>、"等 - JavaScript 字符串内嵌:用
= esc($jsValue, 'js') ?>—— 处理引号、反斜杠、Unicode 编码 - URL 参数值:用
= esc($param, 'url') ?>—— 保证 URL 安全编码 - CSS 值或内联样式:用
= esc($color, 'css') ?>—— 防止 expression() 或 data:uri 注入 - 富文本例外:若需保留部分标签(如
<strong>、<p>),必须引入白名单过滤器(如 HTMLPurifier),而非关闭转义
会话与令牌:防 CSRF + 防劫持双加固
CSRF 和会话劫持常成对出现,需从生成、传输、校验三环节设防。
- CSRF 令牌必须启用且强制嵌入所有状态变更表单:
= csrf_field() ?>,AJAX 请求需在请求头携带X-CSRF-TOKEN(从 cookie 读取) - 会话配置必须启用
httponly和secure:CI 自带的ci_session默认已设httponly=1,但需确认cookie_secure = true(仅 HTTPS 传输) - 启用严格模式:
session.use_strict_mode = 1(PHP 层),拒绝客户端自定义 session ID;CI4 中建议开启$tokenRandomize = true和$regenerate = true - 加密密钥(
encryption_key)必须强随机、唯一、绝不硬编码在 Git 中——推荐用环境变量注入
文件与目录:公共目录不是“公开垃圾桶”
public(或 assets)目录下存放日志、配置、私有 JS/CSS 等,等于把钥匙挂在门把手上。
- 敏感文件严禁放在 web 可直访路径下:日志写入
writable/logs/,配置放app/Config/,上传文件存于非 web 目录并由控制器代理下载 - 对确需保护的子目录(如
public/private/),添加 .htaccess 拒绝直接访问:RewriteRule ^.*$ - [F,L],同时确保重写规则不影响 index.php 入口路由 - 禁用 PHP 解析:在敏感目录的 .htaccess 中添加
php_flag engine off或 Nginx 配置location ~ \.php$ { deny all; } - 删除调试残留:上线前移除
phpinfo()、var_dump()、未注释的测试路由和 debug 工具


















