文档目录
安全响应头配置

简介

本指南面向DouPHP项目的部署与维护人员,聚焦“安全响应头”的配置与落地。内容覆盖X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy以及HSTS(HTTP严格传输安全)的启用方式与适用场景;同时给出CSP(内容安全策略)在DouPHP中的集成思路与最佳实践,并提供开发、测试、生产环境的差异化配置建议与调试方法。

项目结构

DouPHP通过中间件机制在HTTP边界统一下发安全响应头。三端(前台、后台、API)各自提供薄壳中间件类,继承统一的基类实现,所有策略由配置文件集中管理,便于按环境切换。

graph TB
A["请求进入"] --> B["路由解析"]
B --> C["中间件栈"]
C --> D["前端中间件<br/>SecurityHeadersMiddleware"]
C --> E["后台中间件<br/>SecurityHeadersMiddleware"]
C --> F["API中间件<br/>SecurityHeadersMiddleware"]
D --> G["业务控制器/视图"]
E --> G
F --> G
G --> H["响应输出"]

核心组件

  • 安全响应头中间件基类:负责读取配置并下发安全头,包含HSTS的条件下发逻辑。
  • 三端薄壳中间件:前台、后台、API分别继承基类,行为一致,便于分层装配。
  • 安全配置:集中在config/security.php中,统一管理headers及HSTS开关、max-age、子域等。

架构总览

下图展示了请求从进入路由到中间件下发安全头,再到业务处理的完整流程。注意:中间件仅在命中路由时执行,未匹配路由(如404)不受此中间件覆盖。

sequenceDiagram
participant C as "客户端"
participant R as "路由层"
participant M as "安全头中间件(基类)"
participant S as "业务控制器/服务"
participant V as "视图/响应"
C->>R : HTTP 请求
R-->>M : 命中路由后进入中间件栈
M->>M : 读取 security.headers
M->>M : 判断 headers_sent()
alt 已发送头部
M-->>S : 跳过下发
else 未发送头部
M->>M : 下发 X-Content-Type-Options / X-Frame-Options / Referrer-Policy / Permissions-Policy
M->>M : 若 HTTPS 且 hsts.enabled=true 则下发 Strict-Transport-Security
end
M-->>S : 继续处理
S-->>V : 生成响应体
V-->>C : 返回响应含安全头

详细组件分析

安全响应头中间件基类

  • 职责:在管道最前置读取配置并下发基线安全头;HSTS仅在HTTPS且显式开启时下发。
  • 关键点:
    • 使用Config::get('security.headers')获取策略。
    • 检查headers_sent()避免重复或错误设置。
    • 对X-Content-Type-Options、X-Frame-Options、Referrer-Policy、Permissions-Policy进行条件下发。
    • HSTS根据enabled、max_age、subdomains组合生成Strict-Transport-Security值。
flowchart TD
Start(["进入 handle"]) --> ReadCfg["读取 security.headers"]
ReadCfg --> CheckSent{"headers_sent()?"}
CheckSent --> |是| Skip["跳过下发"]
CheckSent --> |否| SendBase["下发基础安全头"]
SendBase --> HSTS{"hsts.enabled && HTTPS?"}
HSTS --> |是| SetHSTS["构建并下发 Strict-Transport-Security"]
HSTS --> |否| Next["调用 next()"]
SetHSTS --> Next
Next --> End(["结束"])

三端薄壳中间件

  • 前台、后台、API均提供独立的SecurityHeadersMiddleware类,仅继承基类,保持行为一致。
  • 优势:便于在各端注册不同的中间件栈或后续扩展差异化策略。

安全配置项说明

  • frame_options:控制X-Frame-Options,支持SAMEORIGIN/DENY/空串关闭。
  • content_type_options:true时下发X-Content-Type-Options: nosniff。
  • referrer_policy:Referrer-Policy策略值,空串关闭。
  • permissions_policy:Permissions-Policy策略值,空串关闭。
  • hsts:
    • enabled:是否启用HSTS。
    • max_age:有效期(秒)。
    • subdomains:是否包含子域。

HSTS(HTTP严格传输安全)

  • 触发条件:
    • 当前请求为HTTPS(request()->isSecure())。
    • 配置中hsts.enabled为真。
  • 行为:
    • 根据max_age与subdomains生成Strict-Transport-Security值并下发。
  • 注意事项:
    • 首次访问必须通过HTTPS才能收到HSTS头;若站点仍允许HTTP访问,请谨慎设置max_age与includeSubDomains。
    • 结合前端强制跳转(如检测到非HTTPS时301跳转至HTTPS)可提升用户体验与安全性。

内容安全策略(CSP)集成建议

  • 现状:基类明确“无CSP”,即默认不自动下发Content-Security-Policy。
  • 推荐做法:
    • 在应用启动早期或全局中间件中按需注入CSP,遵循最小权限原则,逐步收紧。
    • 将CSP策略以配置项形式集中管理,便于不同环境差异化下发。
    • 使用报告模式(report-uri/report-to)先观察再收紧,降低误阻断风险。
    • 针对静态资源、脚本、样式、字体、表单提交目标等进行白名单管理。
    • 对于第三方嵌入(iframe)、图片、媒体等资源,按需放宽并评估风险。
    • 定期审计CSP日志,持续优化策略。

依赖关系分析

  • 中间件依赖配置中心:通过Config读取security.headers。
  • 三端薄壳中间件依赖基类:复用下发逻辑,保证一致性。
  • 初始化流程:各端Init负责加载模块与服务,安全头中间件在路由命中后生效。
classDiagram
class AbstractSecurityHeadersMiddleware {
+handle(next)
-sendHeaders(headers)
}
class Front_SecurityHeadersMiddleware
class Admin_SecurityHeadersMiddleware
class Api_SecurityHeadersMiddleware
class Config
Front_SecurityHeadersMiddleware --> AbstractSecurityHeadersMiddleware : "继承"
Admin_SecurityHeadersMiddleware --> AbstractSecurityHeadersMiddleware : "继承"
Api_SecurityHeadersMiddleware --> AbstractSecurityHeadersMiddleware : "继承"
AbstractSecurityHeadersMiddleware --> Config : "读取 security.headers"

性能与兼容性考虑

  • 中间件仅在命中路由时运行,未命中路由(如404)不会下发安全头。
  • 使用headers_sent()避免重复设置,减少开销。
  • HSTS仅在HTTPS且显式开启时下发,避免不必要的限制。
  • 合理设置CSP可减少浏览器解析与校验成本,但过于宽松会削弱防护效果。

故障排查指南

  • 确认中间件是否执行:
    • 检查请求是否命中路由;未命中路由不会经过中间件。
    • 查看响应头是否包含预期安全头。
  • 常见原因:
    • headers_sent()为真导致无法设置响应头(例如过早输出)。
    • 配置项为空或关闭(如frame_options为空、content_type_options为false)。
    • HSTS未启用或当前请求非HTTPS。
  • 调试步骤:
    • 临时开启调试模式,观察请求生命周期与响应头。
    • 在中间件前后增加日志记录,确认执行路径。
    • 使用浏览器开发者工具或curl -I验证响应头。

结论

DouPHP通过统一的中间件基类与三端薄壳实现,集中管理安全响应头策略,具备良好可扩展性与环境适配能力。建议在生产环境启用HSTS并结合前端强制HTTPS;CSP需按业务需求逐步收紧并配合报告模式持续优化。通过合理的配置与调试手段,可有效提升站点的安全基线。

附录:环境差异化配置建议

  • 开发环境:
    • 可关闭部分严格策略以便调试(如放宽Referrer-Policy、暂时关闭HSTS)。
    • 建议保留X-Content-Type-Options与X-Frame-Options的基础防护。
  • 测试环境:
    • 接近生产配置,启用HSTS(短max_age),Referrer-Policy与Permissions-Policy采用保守策略。
    • 引入CSP报告模式,收集潜在阻断问题。
  • 生产环境:
    • 启用HSTS(合理max_age与includeSubDomains),确保全站HTTPS。
    • 严格Referrer-Policy与Permissions-Policy,限制敏感能力。
    • 实施严格的CSP策略,基于业务需求白名单化资源来源。
    • 定期审查安全头与CSP日志,持续加固。
添加日期:2026-10-05