Skip to content

参考

基于 OWASP Top 10 官方站(owasp.org/Top10)+ MDN Web Docs + Helmet.js 官方站编写,对照 OWASP Top 10:2025 与 Helmet v8.x

速查

  • 前端防护四件套:CSP / HTTP 安全头 / Helmet.js / CORS
  • OWASP Top 10:2025 关键变更:A01 Broken Access Control 居 #1;A03 Injection 含 XSS(2017 是独立 A7);2021 起新增 A04 / A08 / A10
  • CSP 现代姿势nonce + 'strict-dynamic',弃用域名白名单
  • CSP 两种模式:enforcing(违反则阻止)/ Report-Only(仅上报);后者不支持 <meta>
  • CSP frame-ancestors vs X-Frame-Options:并存时 frame-ancestors 优先
  • HSTS preload 前提:max-age ≥ 31536000 + 必须含 includeSubDomains;仅 HTTPS 响应生效
  • Referrer-Policy 默认值strict-origin-when-cross-origin
  • Permissions-Policy allowlist()(全禁用)/ (self)(仅同源)/ *(全允许)/ (self "https://a.com")
  • Helmet 默认 13 头:含 X-XSS-Protection=0;不含 CORS
  • CORS 凭证互斥Allow-Credentials: true 时禁用所有 *
  • CORS preflight 触发:方法 / 头 / Content-Type 三条件任一不满足
  • 核心反模式:CSP 'unsafe-inline' / 'unsafe-eval'、HTTP 头写 <meta>、HSTS 写 HTTP、CSRF 依赖 CORS
  • 完整说明见 入门 / 核心策略详解

OWASP Top 10:2025 完整表

编号名称前端相关性典型前端落点
A01Broken Access Control前端隐藏 ≠ 鉴权;IDOR;JWT 不存 localStorage
A02Cryptographic Failures全站 HTTPS;HSTS;密钥前端不硬编码
A03Injection(含 XSS)CSP;输出转义;Trusted Types;避免 innerHTML / eval
A04Insecure Design威胁建模;Default Deny;最小权限
A05Security MisconfigurationHelmet 默认全套;CSP 不为空;错误页不泄露栈
A06Vulnerable and Outdated Componentsnpm audit / Renovate / Snyk;SRI
A07Identification and Authentication Failures会话超时;SameSite Cookie;JWT 短期
A08Software and Data Integrity Failures子资源完整性;签名依赖;CI 凭证隔离
A09Security Logging and Monitoring FailuresCSP 违规上报
A10Server-Side Request Forgery(SSRF)服务端出网白名单 + 禁重定向 + IMDSv2

关键变更(2017 → 2021 → 2025):A01 从 #5 升到 #1(2021 起);XSS 从独立 A7 合并进 A03;A04 / A08 / A10 是 2021 起新增类别。

HTTP 安全响应头速查表

作用典型值备注
Content-Security-Policy内容白名单(防 XSS)见下文 CSP 指令表与 Report-Only 可共存
Content-Security-Policy-Report-Only仅上报不阻止同 CSP不支持 <meta>
X-Frame-Options防 clickjackingDENY / SAMEORIGINALLOW-FROM 已废弃;与 frame-ancestors 并存时后者优先
X-Content-Type-Options阻止 MIME 嗅探nosniff仅作用于 script / style
Strict-Transport-Security强制 HTTPS(防 SSL Strip)max-age=31536000; includeSubDomains; preload仅 HTTPS 响应生效
Referrer-Policy控制 Referrer 泄露strict-origin-when-cross-origin(浏览器默认)8 个值见下
Permissions-Policy收回浏览器能力camera=(), microphone=()旧名 Feature-Policy 已废弃
Cross-Origin-Opener-Policy隔离顶级浏览上下文same-originHelmet 默认开
Cross-Origin-Resource-Policy限制资源可被谁加载same-originHelmet 默认开
Cross-Origin-Embedder-Policy限制可加载的跨域资源require-corpHelmet 默认不开
X-XSS-Protection已废弃,应设为 0 关闭0Helmet 默认 0;现代替代是 CSP

Referrer-Policy 八值

同源跨源HTTPS→HTTP 降级
no-referrer不发不发不发
no-referrer-when-downgrade完整 URL完整 URL不发
same-origin完整 URL不发不发
originoriginoriginorigin
strict-originoriginorigin不发
origin-when-cross-origin完整 URLoriginorigin
strict-origin-when-cross-origin(默认)完整 URLorigin不发
unsafe-url完整 URL完整 URL完整 URL(危险

HSTS preload 注册前提

条件要求
max-age≥ 31536000(1 年)
includeSubDomains必须
HTTPS 全站所有子域都通过 HTTPS 提供服务
提交hstspreload.org 注册,加入浏览器源码列表

CSP 指令表

指令作用典型值备注
default-src回退策略'self'其他指令未设时用
script-srcJS 来源'self' 'nonce-<r> 'strict-dynamic'现代姿势
style-srcCSS 来源'self' 'nonce-<r>'Helmet 默认含 'unsafe-inline'
img-src图像来源'self' data: https:-
connect-srcfetch / XHR / WS'self' https://api.example.com限制 API 域
font-src字体来源'self' https: data:-
media-src音视频来源'self'-
object-src<object> / <embed>'none'Flash 类已废弃
frame-src本页可嵌入的 iframe'self'-
child-srcWorkers / iframe'self'-
frame-ancestors谁可嵌入本页'self'不能用 nonce/hash
base-uri<base> 限制'self'防 base 注入
form-action表单提交目标'self'防表单外发
plugin-types已废弃-CSP3 移除
report-uri已废弃-迁移到 report-to
report-to违规上报端点default-endpoint配合 Reporting-Endpoints 响应头
require-trusted-types-for强制 Trusted Types'script'防 DOM sink XSS
trusted-types允许的 TT 策略default / none配合 require-trusted-types-for
upgrade-insecure-requests自动升级 HTTP→HTTPS(无值)Helmet 默认开

script-src 源语义

含义注意
'self'同源基础兜底
'nonce-<随机值>'每响应唯一每响应重新生成,不可复用
'strict-dynamic'信任链传递配合 nonce / hash 用
'sha256-<hash>'按内容 hash内容一变就失效
'unsafe-inline'放行内联有 nonce/hash 时被忽略
'unsafe-eval'放行 eval基本等于没设 CSP
'unsafe-hashes'允许按 hash 匹配内联事件配合 hash 用
https:任意 HTTPS范围过大
data:data URI慎用
*任意来源慎用

CORS 头表

请求头

出现位置作用
Origin所有 CORS 请求标识发起方 origin(scheme + host + port)
Access-Control-Request-Method仅 preflight询问实际方法是否允许
Access-Control-Request-Headers仅 preflight询问自定义头是否允许

响应头

出现位置作用通配符规则
Access-Control-Allow-Origin所有 CORS 响应允许的 origin单一值或 *带凭证时禁用 *
Access-Control-Allow-Methodspreflight 响应允许的方法带凭证时禁用 *
Access-Control-Allow-Headerspreflight 响应允许的自定义头带凭证时禁用 *
Access-Control-Expose-Headers实际响应白名单自定义头给 JS 读带凭证时禁用 *
Access-Control-Allow-Credentials实际响应允许带 Cookie / Authorization唯一值 true
Access-Control-Max-Agepreflight 响应preflight 缓存秒数默认 5(浏览器上限不同:Chrome 7200 / Firefox 86400)

简单请求 vs 预检请求

维度简单请求预检请求
触发条件方法在 GET/HEAD/POST + 仅安全列表头 + Content-Type 三种基础类型任一不满足
流程直接发请求先发 OPTIONS,通过后再发实际请求
缓存不缓存Access-Control-Max-Age 缓存 preflight 结果

CORS 凭证请求铁律

Access-Control-Allow-Credentials: true 时:

是否禁用 *
Access-Control-Allow-Origin禁用(必须精确回显 Origin)
Access-Control-Allow-Headers禁用
Access-Control-Allow-Methods禁用
Access-Control-Expose-Headers禁用

否则浏览器直接拒绝响应,前端拿不到数据,Set-Cookie 不写入。

同时响应应配 Vary: Origin 防 CDN 缓存污染。

Helmet.js 默认 13 个头

Helmet 默认值
Content-Security-Policy默认 directives(见入门)
Cross-Origin-Embedder-Policy不开(需要时显式开)
Cross-Origin-Opener-Policysame-origin
Cross-Origin-Resource-Policysame-origin
Origin-Agent-Cluster?1
Referrer-Policystrict-origin-when-cross-origin
Strict-Transport-Securitymax-age=15552000; includeSubDomains(180 天)
X-Content-Type-Optionsnosniff
X-DNS-Prefetch-Controloff
X-Download-Optionsnoopen
X-Frame-OptionsSAMEORIGIN
X-Permitted-Cross-Domain-Policiesnone
X-XSS-Protection0(主动禁用废弃机制)
(移除)X-Powered-By

Helmet 自定义示例

ts
import helmet from "helmet";
import express from "express";

const app = express();

// 默认全套
app.use(helmet());

// 关闭单个
app.use(
  helmet({
    contentSecurityPolicy: false,
  }),
);

// 自定义 CSP
app.use(
  helmet.contentSecurityPolicy({
    useDefaults: true,
    directives: {
      "script-src": ["'self'", "script.example.com"],
      "style-src": ["'self'"],
    },
  }),
);

废弃 / 已下线机制速查

机制状态现代替代
X-Frame-Options: ALLOW-FROM origin已废弃,现代浏览器忽略整个头CSP frame-ancestors
X-XSS-Protection废弃(XSS Auditor 有缺陷)CSP(Helmet 主动设为 0
Feature-Policy已废弃,更名 Permissions-PolicyPermissions-Policy
CSP report-uri已废弃(仍兼容)report-to + Reporting-Endpoints
CSP plugin-typesCSP3 移除object-src 'none'
CORS Access-Control-Allow-Origin: * + Allow-Credentials: true浏览器拒绝响应凭证请求精确回显 Origin

官方资源