codeigniter数据安全防护需分四层落实:存储加密必须用service('encrypter')->encrypt()配合32字节二进制密钥,数据库字段设为text/varbinary;xss过滤应按场景选用,避免全局启用;会话与cookie须强制https三重保护(sess_encrypt_cookie、sess_secure_cookie、cookie_httponly);文件上传需扩展名与内容双重校验。

CodeIgniter 的数据安全防护主要围绕传输加密、存储加密、输入过滤和访问控制四个层面展开。它不提供“开箱即用”的全自动安全方案,而是通过可配置的组件和明确的使用规范,把关键控制点交到开发者手上——用对了很牢靠,用错了容易留缺口。
敏感字段加密存储必须用 Encrypter 服务
CI 4.x 中所有敏感字段(如手机号、身份证号、邮箱)加密必须调用 service('encrypter')->encrypt(),不能手写 base64 或简单哈希。加密密钥不是字符串口令,而是 32 字节二进制密钥:
- 生成方式:在命令行执行
php -r "echo bin2hex(openssl_random_pseudo_bytes(32));",再把结果用hex2bin()转成二进制存入app/Config/Encryption.php的$key属性 - 数据库字段类型必须是
TEXT或VARBINARY,因为加密后数据膨胀约 1.7 倍,且含 IV + HMAC tag - 密钥一旦写死就不能改,否则历史数据全部无法解密
输入过滤要分场景选方法
XSS 过滤器不是万能胶,也不能全局开启:
- 仅对用户提交的富文本内容(如编辑器输出)启用
strip_tags()+html_escape()组合,或用第三方库如 HTMLPurifier - 普通表单字段(用户名、邮箱)应走验证规则
valid_email、alpha_numeric等,而非依赖 XSS 过滤 -
security->xss_clean()已在 CI 4.5+ 中标记为废弃,官方建议用更轻量、更可控的替代方案
会话与 Cookie 必须强制 HTTPS 加密
只要站点启用了 HTTPS,以下三项配置必须同步开启:
-
sess_encrypt_cookie = true:防止客户端篡改 session ID 和 payload -
sess_secure_cookie = true:确保 Cookie 只通过 HTTPS 传输 -
cookie_httponly = true:阻止 JavaScript 访问 Cookie,降低 XSS 劫持风险
注意:如果部署在 Nginx 或 Apache 反向代理后,还需确认 App::$proxyIPs 正确填写可信代理 IP 段,否则 isSecure() 判断会失效,导致 HTTPS 会话降级。
文件上传必须双重校验扩展名与内容
CI 4.7.4 起,is_image 和 mime_in 规则已默认校验客户端扩展名与实际文件头是否一致:
- 上传时禁用
$_FILES['file']['name']直接拼路径,一律用$file->move($targetDir),它会自动清理危险字符 - 若需保留原始文件名,必须手动校验:
pathinfo($file->getName(), PATHINFO_EXTENSION)是否在白名单内 - 对 JS Blob 类无扩展名上传,仍可按 MIME 类型识别,但建议配合
getimagesize()或finfo_open()二次确认











