⭐ 推荐:社区规则条款 V1.0

PHP 安全基线清单:生产环境上线前的 20 项检查

小易先生
小易先生 见习用户见习用户
发布于 2026-09-25 15:48 ·96 浏览 ·2 回复
内容摘要

PHP 生产环境上线前可对照 20 项安全基线,重点锁定 PHP 配置、数据库凭据、请求会话、上传与输出,通过关闭错误回显、隐藏版本、禁用危险函数、最小权限数据库账号与预处理语句、CSRF 与会话 Cookie 防护、上传目录禁止执行 PHP 等措施堵住常见漏洞,并指出页面过期多因 CSRF 校验失败、CDN 缓存或站点地址配置错误。

照着这份清单逐条打勾,你就能在上线前把 PHP 站点最常见的 20 个安全漏洞堵住,而不用等被扫了才回头补。

第一步:先把 PHP 配置层锁死(第 1-4 项)

  1. 关掉错误回显:php.ini 里设 display_errors = Off、log_errors = On、error_log = /var/log/php-error.log。报错信息里常带绝对路径、SQL 片段、配置值,只有攻击者爱看。
  2. 隐藏版本指纹:expose_php = Off,顺手把 Server 响应头里的版本号也去掉,别让扫描器一眼认出你跑的是哪个老版本。
  3. 版本别太旧:确认 PHP 在 7.4 以上并跟进小版本补丁。像 Clara BBS 这类系统要求 PHP 7.4-8.5,只要落在区间内就能跑,升级小版本基本无痛。
  4. 限制可执行范围:用 open_basedir 圈定站点目录,disable_functions 里关掉 exec、shell_exec、system、passthru、proc_open 等。面板用户直接在 PHP 设置里改即可。

第二步:数据库与凭据(第 5-9 项)

  1. 数据库账号不用 root:单独建库、单独建用户,只给该库的 SELECT/INSERT/UPDATE/DELETE,需要建表时临时开 CREATE/ALTER。
  2. 凭据文件和 Web 目录分开:配置文件要么放到 Web 根目录之外,要么用 .php 后缀并在开头 exit,防止被当纯文本下载。
  3. 全站走预处理:PDO 开 ATTR_EMULATE_PREPARES = false,参数一律绑定,禁止字符串拼 SQL。
  4. 密码哈希别自己造:统一用 password_hash()(bcrypt)与 password_verify()。Clara BBS 的密码存储就是 bcrypt,你自写插件时也照这个来。
  5. 数据库端口不对外:3306 只允许本机或内网访问,宝塔面板默认已限制,检查一下安全组别放行全网。

第三步:请求与会话(第 10-13 项)

  1. CSRF 校验不能漏:所有写操作(发帖、改密、支付、删除)都要带 token 并服务端校验。Clara BBS 是全站 CSRF 防护,你写插件表单时记得复用内置机制。
  2. 换登录态要重生成 Session ID:登录成功后调用 session_regenerate_id(true),防会话固定攻击。
  3. Cookie 三件套:HttpOnly、Secure、SameSite=Lax。用 HTTPS 就必须开 Secure。
  4. 站点地址写成唯一的 HTTPS 主域名:后台「基本设置」里把站点地址填成带 https:// 的主域名,别 www 和裸域混用,否则会话会莫名其妙丢。

注意:如果上线后频繁看到"页面已过期,请刷新后重试",多半是 CSRF 校验没过——常见原因是页面被 CDN 缓存太久或站点地址配错。刷新能恢复,但根因要按第 13 项改掉。

第四步:上传与输出(第 14-17 项)

  1. 上传目录禁止执行 PHP:在 uploads 目录加规则拒绝 .php 解析,同时扩展名走白名单 + 图片二次校验(Clara BBS 内置了这套校验)。
  2. 调大上传上限:upload_max_filesize 与 post_max_size 都要大于实际文件体积,宝塔默认 2M,手机照片经常超过,建议调到 30M 以上。
  3. 输出一律转义:用户内容用 htmlspecialchars($s, ENT_QUOTES, 'UTF-8') 再输出,别指望"过滤 script 标签"。
  4. 敏感路径不可访问:.git、.env、composer.lock、备份文件、日志目录统统拒绝访问,并关闭目录浏览。

注意:Clara BBS 的"允许的扩展名"(管图片)和"附件允许的扩展名"(管附件)是两个独立字段,排查上传失败时别只看一个。

第五步:账号、审计与运维(第 18-20 项)

  1. 登录要有失败闭环:同 IP 高频失败拦截 + 连错锁定 + 登录审计日志。Clara BBS 默认连错 5 次锁 15 分钟、到期自动解锁,后台还能手动解锁,看日志去「用户体系→登录日志」。
  2. 后台入口收紧:管理员账号单独强密码、启用 IP 白名单或改后台路径;版主权限按版块给,别顺手给管理员组。
  3. 上线前跑一遍体检:HTTPS 全站强制、数据库每日备份并验证可恢复、开计划任务做健康检查、插件与依赖保持更新。

额外一句:如果你的站点开了 GEO 或对外索引,确认对外输出的内容只含游客可见版块,隐藏版块和权限内容绝不能外泄。

小结

  • 配置层:关错误回显、藏版本、限函数范围
  • 数据层:最小权限账号、预处理、bcrypt
  • 请求层:CSRF、Session 重生成、Cookie 安全属性、统一主域名
  • 上传层:白名单 + 禁执行 + 转义输出
  • 运维层:登录锁定与审计、后台收紧、备份与体检

上线前把 20 项过一遍,比出事后再救火便宜得多。

本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-590.html
转载请注明出处,版权归原作者所有。
他们都看过 2 人浏览过
东来东往小易先生

全部回复 2

东来东往
东来东往 正式会员正式会员认证极客认证极客 1楼 2026-09-25 15:50

这份清单质量很高,基本可以直接当上线前的 checklist 用,尤其是把配置层排在最前面,方向完全对——很多站点出事都是 php.ini 没锁死,而不是代码写错了。

补几个我觉得值得加进去的点。第一,open_basedir 别只圈站点根目录,如果用了独立日志目录或 session 存储路径,要一并放进去,否则日志写不进去反而排障困难。第二,disable_functions 关掉一堆函数后,有些老插件或第三方库会直接报错,建议上线前用测试环境全流程跑一遍,确认没有功能依赖 exec 之类。第三,凭据文件那块可以再狠一点,把数据库密码放进环境变量而不是文件,配合 getenv() 读取,物理上就不在 Web 目录里了。

关于第 14 项,你说的「上传目录禁止执行 PHP」非常关键,再补一句:除了 Nginx 里加 location ~* /uploads/.*\.php$ { deny all; },最好同时在 uploads 目录放一个 .htaccess(php_flag engine off)做双保险,换服务器或面板时不容易漏。扩展名白名单这块要注意,很多系统"图片扩展名"和"附件扩展名"是两个独立字段,只改一个会漏——Clara BBS 就是这样,两个字段分别管图片和附件,上线前都要核对。图片二次校验(用 getimagesize 之类验证真实类型)也是防伪造后缀的关键,别只信 $_FILES['type']。

第 17 项如果讲输出转义,提醒一句:模板里能用 htmlspecialchars 就用,涉及 URL、属性、JS 上下文要分别处理,统一转义反而会出问题。最后一点思路延伸:清单打完勾只是基线,建议再配一套「登录失败拦截 + 登录审计日志」,像 Clara BBS 那种同 IP 高频失败拦截、连错锁定、全程审计,能挡住很大一部分撞库,比事后补救划算得多。

期待你把 15-20 项补完,这套东西值得置顶。

itjianghu
itjianghu 正式会员正式会员认证极客认证极客 #151 2楼 2026-09-25 15:54
东来东往:这份清单质量很高,基本可以直接当上线前的 checklist 用,尤其是把配置层排在最前面,方向完全对——很多站点出事都是 php.ini 没锁死,而不是代码写…

补得比我原文细,尤其 open_basedir 那段,是踩过才写得出来的。不过有两处我想修正一下,不注意会白配。

一是 .htaccess 里的 php_flag engine off 只对 mod_php(Apache 模块模式)生效,跑 PHP-FPM 的站点它会被直接忽略,指令不认识时还可能因 AllowOverride 受限报 500。FPM 下该用 RemoveHandler .php + SetHandler none,或者干脆把 uploads 的解析交给 Nginx 的 location 挡。先确认你的 PHP 跑在哪种模式,再决定写哪条——这两条不是重复保险,选错了等于没写。

二是 open_basedir 多路径在 Linux 下用冒号分隔、Windows 用分号,面板里填错格式会直接白屏;而且 session.save_path、upload_tmp_dir 和日志目录都要一并放进去,否则上传、登录一出问题,你连错误日志都写不出来,排障只能靠猜。