跳到主要内容

Web 状态与跨站安全

如何配置浏览器跨源访问?​

  • CORS: 浏览器对跨源脚本请求的读取限制; 不是服务端鉴权机制;
  • allow origins: 使用明确来源清单; 携带凭据时不能使用通配 *;
  • allow methods/headers: 只开放实际 API 所需集合;
  • preflight: 浏览器以 OPTIONS 探测; 缓存时长需要兼顾变更传播;
  • Hertz 集成: 使用 hertz-contrib/cors 集中配置,不在每个 Handler 手写 Header;
  • Cookie: 浏览器为某个站点保存的小段数据,并在符合 Domain、Path、Secure、SameSite 等条件时自动随请求发送;
  • Secure: 仅通过 HTTPS 发送;
  • HttpOnly: 阻止脚本读取,降低 Token 被 XSS 窃取的风险;
  • SameSite: 根据同站交互选择 Lax、Strict 或 None;
  • Domain/Path: 缩小 Cookie 发送范围;
  • Max-Age: 明确会话寿命和退出时的删除行为;

如何管理服务端会话?​

  • Session: 服务端保存的用户会话状态,浏览器通常只持有用于查找状态的随机 session ID;
  • session ID: Cookie 只存随机标识,权限和业务状态存服务端;
  • session store: 多实例需共享存储或明确粘性会话;
  • rotation: 登录成功、权限提升后更换 session ID;
  • logout: 服务端失效会话,不能只让浏览器删除 Cookie;
  • Hertz 集成: hertz-contrib/sessions 提供中间件和存储扩展;
  • CSRF: 跨站请求伪造;攻击页面利用浏览器自动携带目标站点 Cookie 的行为,诱导用户提交修改请求;
  • 风险条件: 浏览器自动携带 Cookie,恶意站点可诱导状态修改请求;
  • 防护: SameSite + CSRF token + Origin/Referer 校验组合;
  • Bearer Header: 非浏览器自动附带,风险模型不同,但仍需防 XSS;
  • 安全方法: GET、HEAD 不执行状态修改;
  • Hertz 集成: hertz-contrib/csrf 统一 token 生成和验证;

如何避免不可信内容触发 XSS?​

  • XSS: 跨站脚本;不可信内容被当作脚本执行,使攻击代码在受信任站点的页面中运行;
  • CSP: 内容安全策略;通过响应头限制页面允许加载或执行的脚本来源;
  • 输出编码: HTML 模板按上下文转义,不拼接不可信脚本;
  • JSON API: 正确 Content-Type,前端仍需安全渲染;
  • CSP: 限制脚本来源,降低注入后的影响;
  • HttpOnly: 只能保护 Cookie 不被读取,不能阻止恶意脚本发起请求;