本文目录导读:

- 身份鉴别(核心必考项)
- 访问控制(权限管理)
- 安全审计(日志记录)
- 输入输出验证(防注入/防XSS)
- 数据完整性 & 保密性
- PHP环境本身加固
- 渗透测试自检清单(交付前测一遍)
- 特别提醒(开发者容易遗漏的高扣分项)
在PHP项目中通过等级保护(等保)测评,是一个体系化的过程,不仅仅是“写代码”的事,它需要从管理制度、物理环境、网络架构、主机安全、应用安全、数据安全等多个层面去贴合《网络安全等级保护基本要求》(GB/T 22239-2019)。
作为开发者,我们最关注的是应用安全(S3A3)和数据安全层面的整改,下面从代码层面总结一套核心的落地要点,助你拿到高分:
身份鉴别(核心必考项)
这是扣分最严重的地方,PHP项目必须解决弱口令和明文传输。
- 强制密码复杂度:不能只在前端JS限制,必须在后端PHP校验,密码长度≥8位,且包含大小写字母、数字、特殊字符中至少3类。
- 登录失败锁定:在
Session或Redis中记录失败次数,连续失败5次后,锁定账号或IP 15分钟以上。 - 加密存储:密码严禁使用
md5(),必须使用password_hash()配合PASSWORD_BCRYPT或PASSWORD_ARGON2I,验证用password_verify()。 - 传输保密:如果App或网页不支持HTTPS,登录接口必须做国密SM4或AES加密处理后再传输,且密钥不能硬编码在前端。
访问控制(权限管理)
- 强制后台RBAC(基于角色的访问控制):不能只靠前端按钮控制显示/隐藏,后端每个请求(Controller方法)必须校验
Session中的角色权限,没有权限直接返回403。 - 默认禁止:新上传的文件、新建立的用户,默认不给任何执行权限(
chmod 644而非755)。 - 会话超时:登录状态(
$_SESSION)必须设置有效时间(如30分钟),无操作自动销毁,避免管理员离开后账号被盗用。
安全审计(日志记录)
- 全量日志:必须记录所有用户的登录、退出、增删改查操作,特别是后台管理员的操作(如删除数据、修改配置)。
- :包含访问时间、操作人、操作IP、请求URL、请求参数(敏感信息如密码需掩码)、操作结果。
- 日志保护:日志文件(如
/logs/)在Web根目录下必须设置禁止直接访问(Nginx/Apache配置拒绝规则),且日志不能允许普通用户修改。
输入输出验证(防注入/防XSS)
- SQL注入:严禁直接拼接SQL语句,必须使用 PDO预处理语句(Prepared Statement) 或 Laravel/Symfony 的ORM。
- XSS跨站:输出到HTML的所有变量,必须通过
htmlspecialchars($var, ENT_QUOTES, 'UTF-8')转义,或者使用模板引擎(如 Twig/Blade)的自动转义功能。 - 文件上传:校验文件的MIME类型、扩展名(白名单制,只允许
.jpg、.png、.pdf)、文件头(getimagesize()检测)。关键: 上传目录禁止执行PHP,通过Rewrite规则或配置禁用该目录的php_admin_flag engine off。
数据完整性 & 保密性
- 敏感字段加密:数据库中存储的身份证号、手机号、银行卡号等个人隐私信息,必须使用AES-256-CBC加密存储,密钥放服务器端(如
.env文件或密钥管理系统),不能存活在数据库。 - 防篡改:对磁盘上的重要配置文件(如支付回调、订单状态),加入HMAC签名校验,防止被恶意修改。
PHP环境本身加固
- 关闭错误回显:生产环境
display_errors = Off,将错误日志记录到error_log,防止路径泄露和报错注入。 - 危险函数禁用:在
php.ini的disable_functions中禁用危险函数,如system, exec, shell_exec, passthru, popen, proc_open, eval, assert等。 - 禁用旧协议:PHP版本建议至少7.4以上(最好8.x),且禁止使用过时的加密算法(如SSLv3、TLSv1.0/1.1)。
渗透测试自检清单(交付前测一遍)
在等保测评机构的工程师来扫漏洞前,自己先跑一遍:
- 用
sqlmap打一下所有带参数的接口,是否全部阻断?- 用
BurpSuite抓包,看看后台登录是否抓不到明文密码?- 试着上传一个
.php或.phtml文件,是否会被拦截?- 尝试用低权限用户直接访问后台路由,是否被后端拦截?
- 检查
Cookie是否设置了HttpOnly和Secure属性?
特别提醒(开发者容易遗漏的高扣分项)
- 明文密码告警:现在很多PHP框架(如Laravel)自带加密,但很多老项目(如原生PHP或ThinkPHP3)用
md5(sha1($pass)),等保不仅要求防爆破,还要求存储弱碰撞,这是必判不合规项。 - 越权漏洞:很多PHP项目只检查了“是否登录”,但没检查“是否操作自己的数据”,A用户修改了订单号,能查看B用户的订单,等保测试会重点测这种水平越权。
PHP过等保,核心就是转向 “安全开发” 意识和规范的代码落地,如果项目是已经写好的老系统,建议用 PHP -S 排查危险函数,或者使用 OpenResty/WAF 在Web层做二次拦截,作为代码来不及改时的“缓兵之计”,但代码层面的整改是终局方案。
如果你告诉我你们是基于原生PHP还是Laravel/ThinkPHP,我可以给你更针对性的代码片段。