HTTP 安全
HTTP - 安全注意事项
Section titled “HTTP - 安全注意事项”虽然 HTTP 本身是一个简单的协议,但它在 Web 应用程序中的使用涉及到许多安全注意事项。现代 Web 安全主要围绕使用 HTTPS 以及在应用程序和协议层面实现各种防御机制展开。
HTTPS:安全标准
Section titled “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: DENYorX-Frame-Options: SAMEORIGIN通过控制页面是否可以嵌入到<frame>、<iframe>、<embed>或<object>元素中来防御点击劫持攻击。 - Referrer-Policy:
Referrer-Policy: strict-origin-when-cross-originorReferrer-Policy: no-referrer控制随请求发送的引用信息(前一个页面的 URL)的数量。 - Permissions-Policy (formerly Feature-Policy):
Permissions-Policy: geolocation=(), camera=(), microphone=()允许细粒度地控制页面及其 iframes 可以使用哪些浏览器功能(例如相机、麦克风、地理位置)。
身份验证和授权
Section titled “身份验证和授权”- 现代身份验证: 与在每次请求中传输凭据的 Basic/Digest 身份验证不同,现代应用程序通常使用基于令牌的身份验证(例如 JWTs、OAuth 2.0 Bearer 令牌)。这些令牌通常在
Authorization: Bearer <token>请求头中发送。 - 安全的令牌处理: 令牌应该是短生命周期的,仅通过 HTTPS 传输,并安全地存储在客户端(例如,对于 Web 使用
HttpOnly、Secure的 Cookie;对于移动应用使用安全存储)。 - 密码安全: 切勿以明文形式存储密码。使用强度高且加盐的哈希算法(例如 Argon2、scrypt、bcrypt)。
- 会话管理: 使用安全的会话标识符,在登录时重新生成会话 ID,并提供会话失效(注销)机制。
输入验证和输出编码
Section titled “输入验证和输出编码”虽然它们并非严格意义上的 HTTP 功能,但对于应用程序安全至关重要:
- 输入验证: 始终在服务器端验证和清理从客户端接收到的所有数据(URL 参数、请求体、头部),以防止注入攻击(SQL 注入、XSS、命令注入)。
- 输出编码: 在用户界面中渲染数据之前对其进行适当编码,以防止 XSS。例如,在 HTML 中显示的数据进行 HTML 编码,在 URL 中显示的数据进行 URL 编码等。
跨域资源共享 (CORS)
Section titled “跨域资源共享 (CORS)”CORS 是一种基于 HTTP 头部的机制,允许服务器指示浏览器允许从其自身之外的任何源(域、方案或端口)加载资源。配置错误的 CORS 策略(例如,对于需要身份验证的资源使用 Access-Control-Allow-Origin: *)可能导致安全漏洞。
Cookie 安全
Section titled “Cookie 安全”当使用 Cookie 进行会话管理或存储敏感信息时,请使用安全属性:
Secure属性: 确保 Cookie 仅通过 HTTPS 发送。HttpOnly属性: 阻止客户端 JavaScript 访问 Cookie,从而减轻 XSS 风险。SameSite属性(Strict、Lax、None): 通过控制 Cookie 在跨域请求时是否发送,帮助防御跨站请求伪造 (CSRF) 攻击。SameSite=None要求设置Secure属性。
其他注意事项
Section titled “其他注意事项”- 路径遍历: 清理用户提供的文件路径,以防止访问服务器上不预期的文件(例如,禁止
../)。 - DNS 欺骗: 虽然主要是一个网络层面的问题,但应用程序应该意识到 DNS 可能被操纵。使用 DNSSEC 可以提供帮助。
- 开放重定向: 如果您的应用程序重定向到用户提供的 URL,请验证该 URL 以防止重定向到恶意网站。
- 信息泄露: 在生产环境中避免冗长的错误消息、服务器版本标识(
Server头)或堆栈跟踪,因为它们可能暴露可被利用的信息。 - 子资源完整性 (SRI):
<script src="..." integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>通过提供一个加密哈希,确保外部托管的资源(如 CDN 上的 JavaScript/CSS)未被篡改。
安全是一个持续的过程。定期更新依赖项,进行安全审计,并及时了解新的威胁和最佳实践。