文档目录
应用安全配置

简介

本指南面向DouPHP应用的安全配置,聚焦以下方面:

  • CSRF保护:令牌模型、生成与验证流程、中间件集成方式。
  • XSS防护:输入过滤、输出编码、CSP策略建议。
  • SQL注入防护:参数化查询、输入校验、ORM使用规范。
  • 文件上传安全:类型白名单、大小限制、路径遍历防护。
  • 会话安全:Cookie硬化、会话固定攻击防护等。 并提供可操作的配置示例与最佳实践,帮助在现有代码基础上快速落地。

项目结构

DouPHP采用“端(前台/后台/API)+ 中间件 + 服务层”的分层组织。安全相关能力集中在:

  • 全局安全配置:位于配置中心,统一下发响应头与会话策略。
  • 中间件层:CSRF校验、安全响应头、限流、认证鉴权等。
  • 服务层:登录校验、数据持久化、业务规则与输入清洗。
graph TB
Client["客户端"] --> Router["路由分发"]
Router --> MW_Sec["安全响应头中间件"]
Router --> MW_CSRF["CSRF中间件"]
Router --> Controller["控制器/服务"]
Controller --> ORM["数据库访问/ORM"]
Controller --> Storage["文件系统/存储"]

图表来源

  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:35-49
  • admin/middleware/CsrfMiddleware.php:24-80
  • front/middleware/CsrfMiddleware.php:24-96

章节来源

  • config/security.php:17-87
  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:23-49

核心组件

  • 安全响应头中间件:从配置读取基线安全头并下发,HSTS仅在HTTPS且开启时生效。
  • CSRF中间件:按端实现不同令牌模型(静态令牌与一次性令牌),对指定GET链接也进行令牌校验。
  • 会话安全配置:集中管理Cookie的HttpOnly、Secure、SameSite与严格模式。
  • 登录校验服务:将凭据校验与状态写入解耦,避免重复写会话导致令牌失效。
  • 数据访问安全:在服务层提供安全的IN片段构造方法,强制整型化。

章节来源

  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:23-49
  • admin/middleware/CsrfMiddleware.php:24-80
  • front/middleware/CsrfMiddleware.php:24-96
  • config/security.php:51-87
  • _'/module/user/front/service/user/LoginService.php:31-46
  • _'/module/order/admin/service/order/OrderService.php:679-689

架构总览

下图展示请求进入后,安全中间件的执行顺序以及关键决策点。

sequenceDiagram
participant C as "客户端"
participant R as "路由"
participant H as "安全响应头中间件"
participant S as "CSRF中间件"
participant A as "控制器/服务"
participant DB as "数据库"
C->>R : HTTP请求
R->>H : 进入管道
H-->>C : 设置安全响应头
R->>S : 进入CSRF校验
alt 需要令牌
S-->>A : 通过或拒绝
else 豁免路由
S-->>A : 直接放行
end
A->>DB : 参数化查询/ORM操作
DB-->>A : 结果
A-->>C : 响应

图表来源

  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:35-49
  • admin/middleware/CsrfMiddleware.php:47-79
  • front/middleware/CsrfMiddleware.php:62-95

详细组件分析

CSRF保护机制

  • 令牌模型
    • 后台:默认使用共享静态令牌 static_admin;部分匿名流程使用一次性令牌 password_reset。
    • 前台:会员共享静态令牌 static_user;匿名表单(注册、登录、找回密码、留言、落地页、分销申请、咨询)使用一次性令牌。
  • 令牌生成与渲染
    • 控制器通过 csrf()->generate()/token() 在模板中渲染隐藏字段或URL参数。
  • 令牌验证流程
    • 中间件根据路由映射决定令牌ID,并对指定GET链接也进行校验。
    • 校验失败抛出异常,由入口统一处理为友好提示并重定向。
  • 豁免路由
    • 外部支付回调等无session场景通过路由级声明式豁免,不在中间件内硬编码名单。
flowchart TD
Start(["请求进入"]) --> CheckRoute{"是否命中需令牌的路由?"}
CheckRoute -- 否 --> Next["继续后续中间件/控制器"]
CheckRoute -- 是 --> GetToken["提取请求中的CSRF令牌"]
GetToken --> Validate{"令牌有效?"}
Validate -- 否 --> Reject["拒绝并返回错误/重定向"]
Validate -- 是 --> Continue["放行到控制器"]

图表来源

  • admin/middleware/CsrfMiddleware.php:47-79
  • front/middleware/CsrfMiddleware.php:62-95

章节来源

  • admin/middleware/CsrfMiddleware.php:24-80
  • front/middleware/CsrfMiddleware.php:24-96

XSS防护措施

  • 输入过滤
    • 在服务层对敏感字段进行清洗与白名单校验(如站点域名字段的危险字符过滤)。
  • 输出编码
    • 模板渲染时应对用户可控数据进行上下文相关的转义;结合安全响应头降低MIME嗅探风险。
  • CSP策略建议
    • 当前基线安全头未包含CSP;可在Web服务器或框架扩展处按需添加Content-Security-Policy,限制脚本、样式、图片等来源。
flowchart TD
In["用户输入"] --> Filter["服务端输入过滤/白名单"]
Filter --> Store["持久化/缓存"]
Store --> Render["模板渲染"]
Render --> Encode["输出编码/上下文转义"]
Encode --> Out["响应给浏览器"]

图表来源

  • admin/service/setting/SettingService.php:129-152
  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:23-49

章节来源

  • admin/service/setting/SettingService.php:129-152
  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:23-49

SQL注入防护

  • 参数化查询与ORM
    • 优先使用ORM或参数绑定;避免拼接SQL字符串。
  • 输入验证
    • 对ID类参数进行整型转换与范围校验。
  • 安全片段构造
    • 在服务层提供安全的IN片段构造方法,确保仅允许整数参与拼接。
flowchart TD
Input["入参(可能含恶意值)"] --> Validate["类型/范围校验"]
Validate --> ORM["ORM/参数化查询"]
ORM --> DB["数据库执行"]
DB --> Result["安全结果"]

图表来源

  • _'/module/order/admin/service/order/OrderService.php:679-689

章节来源

  • _'/module/order/admin/service/order/OrderService.php:679-689

文件上传安全配置

  • 类型白名单
    • 仅允许受信任的文件扩展名(如图片、文档),禁止可执行脚本类型。
  • 大小限制
    • 在PHP与Web服务器层双重限制最大文件大小,防止资源耗尽。
  • 路径遍历防护
    • 规范化路径、限制根目录、禁止包含“..”等危险片段;文件名随机化或哈希化。
  • 存储隔离
    • 上传目录不可执行;必要时置于Web根之外并通过下载接口访问。

会话安全配置

  • Cookie硬化
    • HttpOnly:禁止JS读取,防XSS窃取会话ID。
    • Secure:仅HTTPS下发;可按运行时环境动态跟随。
    • SameSite:推荐Lax或Strict,跨站请求防御。
    • 严格模式:拒绝未初始化的外部SID,防会话固定攻击。
  • 登录态写入分离
    • 登录校验与服务写入分离,避免AJAX预检阶段提前消耗一次性令牌或写满会话。
classDiagram
class 安全配置 {
+httponly : bool
+secure : null|bool
+samesite : string
+use_strict_mode : bool
}
class 登录服务 {
+校验凭据()
+返回用户行或错误()
}
安全配置 <.. 登录服务 : "会话策略影响登录态写入"

图表来源

  • config/security.php:79-85
  • _'/module/user/front/service/user/LoginService.php:31-46

章节来源

  • config/security.php:79-85
  • _'/module/user/front/service/user/LoginService.php:31-46

依赖关系分析

  • 安全响应头中间件依赖全局安全配置,按端薄壳继承,行为一致。
  • CSRF中间件依赖路由解析与令牌服务,按端定义不同的令牌ID映射与豁免列表。
  • 登录服务依赖认证与审计能力,并将校验与状态写入解耦。
  • 数据访问在服务层进行强类型校验,减少SQL注入风险。
graph LR
SecCfg["安全配置"] --> SecHdr["安全响应头中间件"]
Routes["路由"] --> CsrfMW["CSRF中间件"]
CsrfMW --> Ctrl["控制器/服务"]
LoginSvc["登录服务"] --> Auth["认证/审计"]
Ctrl --> DB["数据库"]

图表来源

  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:35-49
  • admin/middleware/CsrfMiddleware.php:47-79
  • front/middleware/CsrfMiddleware.php:62-95
  • _'/module/user/front/service/user/LoginService.php:31-46

章节来源

  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:35-49
  • admin/middleware/CsrfMiddleware.php:47-79
  • front/middleware/CsrfMiddleware.php:62-95
  • _'/module/user/front/service/user/LoginService.php:31-46

性能与安全权衡

  • 安全响应头:开销极低,建议始终启用。
  • CSRF令牌:增加少量内存与网络负载,但显著提升安全性;对高频POST接口建议配合限流。
  • 输入过滤与输出编码:在关键路径上引入轻微CPU开销,应结合缓存与最小化计算。
  • 会话严格模式:提升安全性,需确保会话初始化正确,避免误拒正常请求。

故障排查指南

  • CSRF校验失败
    • 现象:页面停留过久或重新登录后提交失败。
    • 处理:刷新页面或重新登录;检查路由是否正确豁免;确认模板已渲染令牌。
    • 参考:后台与前台CSRF中间件的拒绝逻辑。
  • 安全响应头未生效
    • 现象:缺少X-Frame-Options、Referrer-Policy等。
    • 处理:检查配置项 headers 是否设置;确认中间件已挂载;确认非404自渲染路径。
  • 登录态异常
    • 现象:AJAX预检后原生提交失败。
    • 处理:确认登录校验与服务写入分离;避免在AJAX阶段消费一次性令牌。

章节来源

  • admin/middleware/CsrfMiddleware.php:68-79
  • front/middleware/CsrfMiddleware.php:85-95
  • core/foundation/middleware/AbstractSecurityHeadersMiddleware.php:23-49
  • _'/module/user/front/service/user/LoginService.php:31-46

结论

DouPHP在安全层面提供了中间件化、配置化的基础能力:

  • 通过安全响应头与会话配置强化传输与身份安全。
  • 通过CSRF中间件与令牌模型覆盖常见跨站请求伪造场景。
  • 在服务层进行输入清洗与数据访问加固,降低XSS与SQL注入风险。 建议在部署时结合WAF、CDN与服务器安全基线,形成纵深防御体系。

附录:配置清单与最佳实践

  • CSRF
    • 在表单中渲染令牌字段;对敏感GET链接加入令牌参数。
    • 对外部回调使用路由级豁免;保持令牌生命周期与页面一致。
    • 参考:后台与前台CSRF中间件。
  • XSS
    • 输入侧:白名单校验、长度与格式限制。
    • 输出侧:模板上下文转义;谨慎使用富文本。
    • 策略:在网关或框架扩展中添加CSP,限制脚本来源与执行权限。
  • SQL注入
    • 一律使用参数化查询或ORM;对ID类参数整型化与范围校验。
    • 参考:服务层安全IN片段构造。
  • 文件上传
    • 类型白名单、大小限制、路径规范化与随机命名;存储目录不可执行。
  • 会话安全
    • 启用HttpOnly、Secure(或跟随HTTPS)、SameSite=Lax/Strict;开启严格模式。
    • 参考:安全配置与会话策略。

章节来源

  • admin/middleware/CsrfMiddleware.php:24-80
  • front/middleware/CsrfMiddleware.php:24-96
  • _'/module/order/admin/service/order/OrderService.php:679-689
  • config/security.php:51-87
添加日期:2026-10-05