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

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

照着这份清单逐条打勾,你就能在上线前把 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轻量论坛系统 - 轻量级 PHP 论坛系统,原文地址:https://www.leleweb.cn/thread-590.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
小易先生

全部回复 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 和日志目录都要一并放进去,否则上传、登录一出问题,你连错误日志都写不出来,排障只能靠猜。