PHP项目怎么通过等保

wen PHP项目 2

本文目录导读:

PHP项目怎么通过等保

  1. 身份鉴别(核心必考项)
  2. 访问控制(权限管理)
  3. 安全审计(日志记录)
  4. 输入输出验证(防注入/防XSS)
  5. 数据完整性 & 保密性
  6. PHP环境本身加固
  7. 渗透测试自检清单(交付前测一遍)
  8. 特别提醒(开发者容易遗漏的高扣分项)

在PHP项目中通过等级保护(等保)测评,是一个体系化的过程,不仅仅是“写代码”的事,它需要从管理制度、物理环境、网络架构、主机安全、应用安全、数据安全等多个层面去贴合《网络安全等级保护基本要求》(GB/T 22239-2019)。

作为开发者,我们最关注的是应用安全(S3A3)数据安全层面的整改,下面从代码层面总结一套核心的落地要点,助你拿到高分:

身份鉴别(核心必考项)

这是扣分最严重的地方,PHP项目必须解决弱口令和明文传输。

  • 强制密码复杂度:不能只在前端JS限制,必须在后端PHP校验,密码长度≥8位,且包含大小写字母、数字、特殊字符中至少3类。
  • 登录失败锁定:在 SessionRedis 中记录失败次数,连续失败5次后,锁定账号或IP 15分钟以上。
  • 加密存储:密码严禁使用 md5(),必须使用 password_hash() 配合 PASSWORD_BCRYPTPASSWORD_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.inidisable_functions 中禁用危险函数,如 system, exec, shell_exec, passthru, popen, proc_open, eval, assert 等。
  • 禁用旧协议:PHP版本建议至少7.4以上(最好8.x),且禁止使用过时的加密算法(如SSLv3、TLSv1.0/1.1)。

渗透测试自检清单(交付前测一遍)

在等保测评机构的工程师来扫漏洞前,自己先跑一遍:

  1. sqlmap 打一下所有带参数的接口,是否全部阻断?
  2. BurpSuite 抓包,看看后台登录是否抓不到明文密码?
  3. 试着上传一个 .php.phtml 文件,是否会被拦截?
  4. 尝试用低权限用户直接访问后台路由,是否被后端拦截?
  5. 检查 Cookie 是否设置了 HttpOnlySecure 属性?

特别提醒(开发者容易遗漏的高扣分项)

  • 明文密码告警:现在很多PHP框架(如Laravel)自带加密,但很多老项目(如原生PHP或ThinkPHP3)用 md5(sha1($pass)),等保不仅要求防爆破,还要求存储弱碰撞,这是必判不合规项。
  • 越权漏洞:很多PHP项目只检查了“是否登录”,但没检查“是否操作自己的数据”,A用户修改了订单号,能查看B用户的订单,等保测试会重点测这种水平越权

PHP过等保,核心就是转向 “安全开发” 意识和规范的代码落地,如果项目是已经写好的老系统,建议用 PHP -S 排查危险函数,或者使用 OpenResty/WAF 在Web层做二次拦截,作为代码来不及改时的“缓兵之计”,但代码层面的整改是终局方案。

如果你告诉我你们是基于原生PHP还是Laravel/ThinkPHP,我可以给你更针对性的代码片段。

抱歉,评论功能暂时关闭!