Skip to content

HTTP 安全

虽然 HTTP 本身是一个简单的协议,但它在 Web 应用程序中的使用涉及到许多安全注意事项。现代 Web 安全主要围绕使用 HTTPS 以及在应用程序和协议层面实现各种防御机制展开。

**HTTPS(HTTP Secure)已不再是可选的,而是必需的。**它使用传输层安全(TLS)加密 HTTP 消息,提供:

  • 保密性: 通过加密传输中的数据来防止窃听。
  • 完整性: 确保数据在传输过程中未被篡改。
  • 身份验证: 通过数字证书验证 Web 服务器(以及可选地验证客户端)的身份。

浏览器现在会主动将非 HTTPS 网站标记为“不安全”。使用 HTTPS 可以防御中间人(MitM)攻击、数据嗅探和内容注入。

服务器可以发送特定的 HTTP 响应头来指示浏览器启用安全功能:

  • Strict-Transport-Security (HSTS): Strict-Transport-Security: max-age=31536000; includeSubDomains; preload 指示浏览器在指定时间内仅通过 HTTPS 与服务器通信,防止协议降级攻击。
  • Content-Security-Policy (CSP): Content-Security-Policy: default-src 'self'; script-src 'self' trusted.cdn.com; img-src *; 通过定义允许的内容来源(脚本、样式、图像等),帮助防止跨站脚本 (XSS) 和其他注入攻击。
  • X-Content-Type-Options: X-Content-Type-Options: nosniff 阻止浏览器对响应进行 MIME 嗅探,使其偏离声明的 Content-Type,减少用户上传内容可能被误解释为可执行文件的风险。
  • X-Frame-Options: X-Frame-Options: DENY or X-Frame-Options: SAMEORIGIN 通过控制页面是否可以嵌入到 <frame>、<iframe>、<embed> 或 <object> 元素中来防御点击劫持攻击。
  • Referrer-Policy: Referrer-Policy: strict-origin-when-cross-origin or Referrer-Policy: no-referrer 控制随请求发送的引用信息(前一个页面的 URL)的数量。
  • Permissions-Policy (formerly Feature-Policy): Permissions-Policy: geolocation=(), camera=(), microphone=() 允许细粒度地控制页面及其 iframes 可以使用哪些浏览器功能(例如相机、麦克风、地理位置)。
  • 现代身份验证: 与在每次请求中传输凭据的 Basic/Digest 身份验证不同,现代应用程序通常使用基于令牌的身份验证(例如 JWTs、OAuth 2.0 Bearer 令牌)。这些令牌通常在 Authorization: Bearer <token> 请求头中发送。
  • 安全的令牌处理: 令牌应该是短生命周期的,仅通过 HTTPS 传输,并安全地存储在客户端(例如,对于 Web 使用 HttpOnly、Secure 的 Cookie;对于移动应用使用安全存储)。
  • 密码安全: 切勿以明文形式存储密码。使用强度高且加盐的哈希算法(例如 Argon2、scrypt、bcrypt)。
  • 会话管理: 使用安全的会话标识符,在登录时重新生成会话 ID,并提供会话失效(注销)机制。

虽然它们并非严格意义上的 HTTP 功能,但对于应用程序安全至关重要:

  • 输入验证: 始终在服务器端验证和清理从客户端接收到的所有数据(URL 参数、请求体、头部),以防止注入攻击(SQL 注入、XSS、命令注入)。
  • 输出编码: 在用户界面中渲染数据之前对其进行适当编码,以防止 XSS。例如,在 HTML 中显示的数据进行 HTML 编码,在 URL 中显示的数据进行 URL 编码等。

CORS 是一种基于 HTTP 头部的机制,允许服务器指示浏览器允许从其自身之外的任何源(域、方案或端口)加载资源。配置错误的 CORS 策略(例如,对于需要身份验证的资源使用 Access-Control-Allow-Origin: *)可能导致安全漏洞。

当使用 Cookie 进行会话管理或存储敏感信息时,请使用安全属性:

  • Secure 属性: 确保 Cookie 仅通过 HTTPS 发送。
  • HttpOnly 属性: 阻止客户端 JavaScript 访问 Cookie,从而减轻 XSS 风险。
  • SameSite 属性(Strict、Lax、None): 通过控制 Cookie 在跨域请求时是否发送,帮助防御跨站请求伪造 (CSRF) 攻击。SameSite=None 要求设置 Secure 属性。
  • 路径遍历: 清理用户提供的文件路径,以防止访问服务器上不预期的文件(例如,禁止 ../)。
  • DNS 欺骗: 虽然主要是一个网络层面的问题,但应用程序应该意识到 DNS 可能被操纵。使用 DNSSEC 可以提供帮助。
  • 开放重定向: 如果您的应用程序重定向到用户提供的 URL,请验证该 URL 以防止重定向到恶意网站。
  • 信息泄露: 在生产环境中避免冗长的错误消息、服务器版本标识(Server 头)或堆栈跟踪,因为它们可能暴露可被利用的信息。
  • 子资源完整性 (SRI): <script src="..." integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script> 通过提供一个加密哈希,确保外部托管的资源(如 CDN 上的 JavaScript/CSS)未被篡改。

安全是一个持续的过程。定期更新依赖项,进行安全审计,并及时了解新的威胁和最佳实践。