文档目录
应用安全配置

简介

本章节面向部署与运维人员,系统说明 DouPHP 的应用安全配置要点,包括:

  • 应用密钥 DOU_APP_KEY 的生成方式、长度与复杂度要求、更换策略
  • 系统标识 SYSTEM_SIGN 的作用与配置
  • 调试模式 DOU_DEBUG 的环境差异与生产环境关闭建议
  • 应用密钥的安全存储与加密方案
  • 会话安全、CSRF 保护等关键安全选项
  • HTTPS 与 HSTS 相关设置

项目结构

DouPHP 将“应用常量”和“安全栈配置”分置在不同配置文件:

  • 应用常量与入口开关位于 config/config.php,包含 DOU_APP_KEY、SYSTEM_SIGN、DOU_DEBUG 等
  • 安全栈配置位于 config/security.php,涵盖可信代理、可信 Host、响应安全头、限流与会话 Cookie 硬化
  • 请求对象 Request 在早期阶段加载安全配置,确保 IP/Host 判定先于业务逻辑生效
  • 中间件层提供 CSRF 校验与安全响应头下发
graph TB
A["config/config.php<br/>定义 DOU_APP_KEY / SYSTEM_SIGN / DOU_DEBUG"] --> B["core/web/http/Request.php<br/>读取安全配置并设置可信代理/Host"]
C["config/security.php<br/>安全栈配置代理/Host/头/限流/会话"] --> B
B --> D["前端/后台/API 中间件<br/>CSRF / 安全头 / 限流"]
D --> E["控制器/服务"]

图示来源

  • config.php:33-52
  • security.php:51-87
  • Request.php:72-97

章节来源

  • config.php:33-52
  • security.php:51-87
  • Request.php:72-97

核心组件

  • 应用密钥 DOU_APP_KEY:用于签名、加密派生等安全用途。安装/升级流程会生成或保留该值。
  • 系统标识 SYSTEM_SIGN:用于站点识别与上报,便于云服务等场景区分实例。
  • 调试模式 DOU_DEBUG:控制错误输出与调试信息,生产环境必须关闭。
  • 安全栈 security.*:可信代理、可信 Host、安全响应头、限流与会话 Cookie 硬化。
  • CSRF 中间件:前台与后台分别实现,覆盖一次性令牌与静态令牌模型。
  • 安全响应头中间件:统一下发 X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy,以及可选 HSTS。

章节来源

  • config.php:33-52
  • security.php:51-87
  • CsrfMiddleware.php(前台):24-53
  • CsrfMiddleware.php(后台):24-66
  • AbstractSecurityHeadersMiddleware.php:23-49

架构总览

下图展示从请求进入、安全配置加载到 CSRF 校验与安全头下发的整体流程。

sequenceDiagram
participant Client as "客户端"
participant Request as "Request.php"
participant SecCfg as "security.php"
participant Csrf as "CSRF 中间件"
participant SecHdr as "安全头中间件"
participant App as "控制器/服务"
Client->>Request : 发起 HTTP 请求
Request->>SecCfg : 读取 trusted_proxies / trusted_hosts
Request-->>Client : 基于可信代理/Host 解析真实 IP/域名
Client->>Csrf : 提交表单/敏感操作
Csrf-->>Client : 校验令牌静态/一次性通过或拒绝
Client->>SecHdr : 获取响应
SecHdr-->>Client : 下发安全响应头含 HSTS 条件
SecHdr->>App : 继续处理业务

图示来源

  • Request.php:72-97
  • security.php:51-87
  • CsrfMiddleware.php(前台):24-53
  • CsrfMiddleware.php(后台):24-66
  • AbstractSecurityHeadersMiddleware.php:23-49

详细组件分析

应用密钥 DOU_APP_KEY

  • 生成与长度
    • 安装器会写入 define('DOU_APP_KEY', ...),且断言其为 64 位十六进制字符串。
    • 升级器会保留已提供的 app_key,保证幂等稳定。
  • 复杂度与强度
    • 64 位十六进制等价于 256 位随机性,满足现代密码学对对称密钥/签名的强度要求。
  • 定期更换策略
    • 建议结合密钥轮换流程:生成新密钥 -> 更新配置 -> 重新签发/刷新依赖该密钥的令牌或缓存 -> 旧密钥宽限期后下线。
    • 若使用基于该密钥派生的会话或签名,需评估影响面并制定回滚预案。
  • 安全存储
    • 仅保存在服务器可访问的配置文件中,禁止纳入版本库;配合文件系统权限与最小化访问原则。
    • 对于第三方集成密钥(如 AI 提供商),框架在落盘前进行加密存储,避免明文持久化。
flowchart TD
Start(["开始"]) --> Gen["安装器生成 64 位十六进制 DOU_APP_KEY"]
Gen --> Write["写入 config/config.php"]
Write --> Upgrade{"是否升级?"}
Upgrade --> |是| Preserve["升级器保留已有 app_key"]
Upgrade --> |否| End(["完成"])
Preserve --> End

图示来源

  • config-app-key-smoke.php:65-106
  • config.php:48-52

章节来源

  • config-app-key-smoke.php:65-106
  • config.php:48-52
  • AiKey.php:53-65

系统标识 SYSTEM_SIGN

  • 作用
    • 作为站点/实例的唯一标识,参与系统信息上报,便于云服务统计与诊断。
  • 配置
    • 在 config/config.php 中定义,可按企业/租户维度区分。
  • 使用位置
    • 云端更新状态服务会将 system_sign 打包进系统信息中上报。

章节来源

  • config.php:33-34
  • UpdateStateService.php:73-89

调试模式 DOU_DEBUG

  • 含义
    • 控制运行时是否输出调试信息与详细错误堆栈。
  • 环境建议
    • 开发/测试:可开启以便定位问题。
    • 生产:必须关闭,避免泄露内部路径、SQL、变量等敏感信息。
  • 当前默认
    • 示例配置中为开启,部署至生产环境时应改为关闭。

章节来源

  • config.php:51-52

安全栈配置 security.*

  • 可信代理 trusted_proxies
    • 空表示不信任任何代理,仅使用 REMOTE_ADDR;当部署在 Nginx/负载均衡后,需将出口 IP 加入白名单,以正确采信 X-Forwarded-*。
  • 可信 Host trusted_hosts
    • 非空时仅放行命中项,未命中回落至首项,防止 Host 头注入污染对外 URL。
  • 安全响应头 headers
    • X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy 由中间件统一下发。
    • HSTS:仅在 HTTPS 且 enabled 时下发,可配置 max_age 与 subdomains。
  • 限流 throttle
    • 支持文件后端存储与全局默认限流策略,用于抵御暴力破解与滥用。
  • 会话 session
    • httponly:建议恒 true,防 XSS 窃取 sid。
    • secure:null 表示跟随 IS_HTTPS;true/false 可强制。
    • samesite:Lax/Strict/None,防御跨站 CSRF。
    • use_strict_mode:建议恒 true,拒绝未初始化外部 sid,防会话固定。
flowchart TD
S["请求进入"] --> P["Request 读取 trusted_proxies/trusted_hosts"]
P --> R["解析真实 IP/规范 Host"]
R --> M["中间件链:CSRF / 安全头 / 限流"]
M --> H["根据 security.headers 下发安全头"]
H --> O["返回响应"]

图示来源

  • Request.php:72-97
  • AbstractSecurityHeadersMiddleware.php:23-49
  • security.php:51-87

章节来源

  • security.php:51-87
  • Request.php:72-97
  • AbstractSecurityHeadersMiddleware.php:23-49

CSRF 保护

  • 前台
    • 登录会员使用共享静态令牌 static_user;匿名表单使用一次性令牌抗重放。
    • 部分 GET 链接也携带 token 并校验(如取消预约、导出报表等)。
  • 后台
    • 登录后统一下发静态令牌 static_admin;找回密码等匿名流程使用一次性令牌 password_reset。
    • 备份/导入/报表导出等带 token 的 GET 链接同样校验。
  • 豁免机制
    • 完全不需要 CSRF 的路由通过路由级声明式豁免,不在中间件内硬编码名单。
sequenceDiagram
participant U as "用户"
participant F as "前台 CSRF 中间件"
participant A as "后台 CSRF 中间件"
U->>F : 提交表单携带 token
F-->>U : 校验通过/失败
U->>A : 管理端提交携带 token
A-->>U : 校验通过/失败

图示来源

  • CsrfMiddleware.php(前台):24-53
  • CsrfMiddleware.php(后台):24-66

章节来源

  • CsrfMiddleware.php(前台):24-53
  • CsrfMiddleware.php(后台):24-66

HTTPS 与 HSTS 配置

  • HSTS
    • 由 security.headers.hsts 控制:enabled 为 true 且当前为 HTTPS 时才下发 Strict-Transport-Security。
    • 可配置 max_age 与 subdomains(是否包含子域)。
  • 证书与传输
    • 建议在反向代理(Nginx/CDW)终止 TLS,并将 X-Forwarded-Proto 透传给应用;同时在 trusted_proxies 中登记代理出口 IP。
    • 邮件发送通道支持 STARTTLS 加密连接,保障凭证与内容传输安全。
flowchart TD
C["客户端 HTTPS"] --> T["反向代理终止 TLS"]
T --> A["应用接收 X-Forwarded-Proto=https"]
A --> H["安全头中间件检测 isSecure()"]
H --> |HSTS 启用| S["下发 HSTS 头"]
H --> |未启用| N["不下发 HSTS"]

图示来源

  • security.php:62-72
  • AbstractSecurityHeadersMiddleware.php:23-49

章节来源

  • security.php:62-72
  • AbstractSecurityHeadersMiddleware.php:23-49

密钥与凭据的加密存储

  • 应用密钥 DOU_APP_KEY
    • 安装器生成 64 位十六进制;升级器保留已有值,保证幂等。
  • 第三方凭据(AI Key 等)
    • 写入数据库前进行加密,读取时解密,避免明文落盘。
  • 最佳实践
    • 将 DOU_APP_KEY 与第三方密钥分离管理;使用最小权限的文件系统访问控制;定期轮换并记录审计日志。

章节来源

  • config-app-key-smoke.php:65-106
  • AiKey.php:53-65

依赖关系分析

  • config/config.php 提供 DOU_APP_KEY、SYSTEM_SIGN、DOU_DEBUG 等基础常量。
  • config/security.php 提供安全栈配置,被 Request 与安全中间件消费。
  • Request 在早期阶段加载安全配置,确保后续所有模块基于正确的 IP/Host 上下文运行。
  • 中间件层(CSRF、安全头、限流)依赖上述配置,形成端到端的安全防护链。
graph LR
CFG["config/config.php"] --> REQ["Request.php"]
SEC["config/security.php"] --> REQ
REQ --> CSRF["CSRF 中间件"]
REQ --> HDR["安全头中间件"]
CSRF --> APP["业务控制器"]
HDR --> APP

图示来源

  • config.php:33-52
  • security.php:51-87
  • Request.php:72-97
  • CsrfMiddleware.php(前台):24-53
  • CsrfMiddleware.php(后台):24-66
  • AbstractSecurityHeadersMiddleware.php:23-49

章节来源

  • config.php:33-52
  • security.php:51-87
  • Request.php:72-97

性能与安全注意事项

  • 在生产环境务必关闭 DOU_DEBUG,减少敏感信息泄露风险。
  • 合理配置 trusted_proxies 与 trusted_hosts,避免误判真实 IP 与 Host。
  • 启用 HSTS 时需确保全站 HTTPS 且证书有效,避免降级攻击。
  • 对高并发场景,谨慎开启全局限流,优先针对敏感接口定向限流。
  • 会话 Cookie 建议 httponly=true、secure 跟随 HTTPS、samesite=Lax/Strict。

故障排查指南

  • CSRF 校验失败
    • 常见原因:页面停留过久导致令牌失效、跨站请求未携带 token、GET 续跑链接未带 token。
    • 处理建议:刷新页面重新获取 token;检查表单与 AJAX 是否注入 token;确认路由未错误豁免 csrf。
  • Host/IP 异常
    • 检查 trusted_proxies 是否包含代理出口 IP;trusted_hosts 是否包含实际域名。
  • HSTS 不生效
    • 确认当前为 HTTPS 且 security.headers.hsts.enabled=true;检查反向代理是否正确透传协议。
  • 调试信息泄露
    • 确认 DOU_DEBUG 在生产环境已关闭;检查日志级别与输出渠道。

章节来源

  • CsrfMiddleware.php(后台):68-79
  • security.php:51-87
  • config.php:51-52

结论

DouPHP 提供了完善的安全配置体系:通过 DOU_APP_KEY 保障签名与加密强度,SYSTEM_SIGN 实现实例识别,DOU_DEBUG 控制调试输出;借助 security.* 实现可信代理/Host、安全响应头、限流与会话硬化;前后端 CSRF 中间件覆盖静态与一次性令牌;HSTS 与 SMTP TLS 进一步加固传输安全。按本文建议完成配置与加固,可在不同环境下获得一致的安全基线。

附录

  • 快速核对清单
    • 生产环境关闭 DOU_DEBUG
    • 配置 trusted_proxies 与 trusted_hosts
    • 启用 HSTS(全站 HTTPS)
    • 会话 Cookie 设置为 httponly=true、secure 跟随 HTTPS、samesite=Lax/Strict
    • 定期轮换 DOU_APP_KEY 与第三方凭据,并使用加密存储
    • 审查 CSRF 豁免路由,确保最小化暴露面
添加日期:2026-10-05