PHP 应用等保2.0合规实践)等保2.0(GB/T22239-2019)对 Web 应用的技术要求集中在安全通信、身份鉴别、访问控制、安全审计、入侵防范五个控制域。以下按三级系统(最常见定级)展开。 --- 一、身份鉴别(8.1.2) 三级要求双因素认证,禁止弱口令: // 登录:密码 + TOTP 双因素 use PragmaRX\Google2FA\Google2FA;class AuthController{publicfunctionlogin(Request$request): Response{// 第一因素:密码,使用 Argon2idif(!password_verify($request->password,$user->password_hash)){$this->recordFailedAttempt($request->ip());throw new AuthException('认证失败');}// 第二因素:TOTP$g2fa=new Google2FA();if(!$g2fa->verifyKey($user->totp_secret,$request->otp)){throw new AuthException('动态码错误');}// 连续失败锁定(等保要求:失败次数可配置)$this->clearFailedAttempts($request->ip());return$this->issueSession($user);}}推荐库:pragmarx/google2fa + bacon/bacon-qr-code 密码策略(三级最低要求): - 长度 ≥8位,含大小写+数字+特殊字符 -90天强制更换 - 禁止复用最近5次密码 - 连续失败5次锁定账户 --- 二、访问控制(8.1.3) // 基于角色的最小权限,拒绝默认 class PermissionMiddleware{publicfunctionhandle(Request$request, Closure$next, string$permission): Response{if(!$request->user()?->can($permission)){// 等保要求:记录越权访问尝试 Log::channel('security')->warning('unauthorized_access',['user_id'=>$request->user()?->id,'permission'=>$permission,'uri'=>$request->getRequestUri(),'ip'=>$request->ip(),]);abort(403);}return$next($request);}}推荐:spatie/laravel-permission,配合数据库存储角色权限,支持审计。 --- 三、安全审计(8.1.4) 三级要求:审计覆盖每个用户,日志不可删除,保留 ≥6个月。 // 安全事件日志格式(满足等保审计要求) class SecurityAuditLogger{publicfunctionlog(string$event, array$context=[]): void{$entry=['event_type'=>$event,'timestamp'=>now()->toIso8601String(),'user_id'=>auth()->id()??'anonymous','session_id'=>session()->getId(),'ip'=>request()->ip(),'user_agent'=>request()->userAgent(),'result'=>$context['result']??'success','detail'=>$context,];// 写入独立审计库,应用账号只有 INSERT 权限 DB::connection('audit')->table('security_logs')->insert($entry);}}必须审计的事件: - 登录成功/失败 - 权限变更 - 重要数据访问/修改/删除 - 系统配置变更 - 账户创建/禁用 --- 四、入侵防范(8.1.5) 输入验证 — 防 SQL 注入、XSS、命令注入 // 永远使用参数化查询,禁止拼接 SQL$users=DB::select('SELECT * FROM users WHERE id = ?',[$id]);// XSS:输出时转义echohtmlspecialchars($userInput, ENT_QUOTES|ENT_HTML5,'UTF-8');// 文件上传:白名单 MIME + 重命名$allowed=['image/jpeg','image/png','application/pdf'];if(!in_array($file->getMimeType(),$allowed,true)){abort(422,'不允许的文件类型');}$filename=Str::uuid().'.'.$file->extension();// 不使用原始文件名 安全响应头(等保 Web 应用加固项) // Middleware 统一注入安全头$response->headers->set('X-Frame-Options','DENY');$response->headers->set('X-Content-Type-Options','nosniff');$response->headers->set('X-XSS-Protection','1; mode=block');$response->headers->set('Strict-Transport-Security','max-age=31536000; includeSubDomains');$response->headers->set('Content-Security-Policy',"default-src 'self'");$response->headers->remove('X-Powered-By');// 隐藏技术栈$response->headers->remove('Server');--- 五、通信传输(8.1.1)# Nginx — 等保三级要求 TLS 1.2+,禁用弱密码套件ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphers on;ssl_session_timeout 1d;ssl_session_cache shared:SSL:50m;--- 六、剩余信息保护(8.1.6) // Session 退出时彻底清除 publicfunctionlogout(Request$request): void{Auth::logout();$request->session()->invalidate();$request->session()->regenerateToken();}// 敏感字段查询后不缓存 Cache::forget("user_sensitive_{$userId}");--- 七、等保测评常见扣分项(PHP 应用高频) ┌──────────────────┬─────────────────────────────────────────┐ │ 问题 │ 修复方式 │ ├──────────────────┼─────────────────────────────────────────┤ │ 无双因素认证 │ 接入 TOTP / 短信 OTP │ ├──────────────────┼─────────────────────────────────────────┤ │ Session 固定攻击 │ 登录后 session_regenerate_id(true)│ ├──────────────────┼─────────────────────────────────────────┤ │ 错误信息泄露堆栈 │ 生产环境display_errors=Off,日志写文件 │ ├──────────────────┼─────────────────────────────────────────┤ │ 目录遍历 │ Nginx 关闭 autoindex,PHP 禁止直接访问 │ ├──────────────────┼─────────────────────────────────────────┤ │ 弱加密算法 │ 禁用 MD5/SHA1 存密码,改 Argon2id │ ├──────────────────┼─────────────────────────────────────────┤ │ 无登录超时 │ Session 空闲30分钟自动失效 │ ├──────────────────┼─────────────────────────────────────────┤ │ 越权未记录 │403响应同时写安全审计日志 │ └──────────────────┴─────────────────────────────────────────┘ --- 八、推荐工具链# 代码层安全扫描(CI 集成)composerrequire--devenlightn/enlightn# Laravel 安全检查composerrequire--devphpstan/phpstan# 静态分析composerrequire--devroave/security-advisories# 依赖漏洞检查(composer update 时自动阻断)等保测评前建议跑一次 php artisan enlightn 和 OWASP ZAP 动态扫描,覆盖大部分技术检查项。