安全和 HTTP 标头
“您是否知道大多数安全漏洞可以通过在响应标头中实现必要的标头来修复?”
-Chandan Kumar
介绍
HTTP 标头允许客户端和服务器在请求或响应中传递附加信息。HTTP 标头由不区分大小写的名称、冒号“:”和其值(不带换行符)组成。值前的空格将被忽略
。—— MDN
这些标头是 HTTP 通信的组成部分,它们携带有关客户端浏览器、cookie、语言等的信息。
可以根据上下文对标题进行分组:
-
通用报头:请求和响应都有,但与最终在主体中传输的数据无关。
-
请求头:有关要获取的资源或客户端本身的信息。
-
响应头:有关响应的信息,例如其位置或服务器本身。
-
实体头:有关实体主体的信息,例如其内容长度或其 MIME 类型。
安全标头
使用这些标头是我们开发应用程序时应遵循的最佳实践之一。“安全标头”旨在限制现代浏览器遇到漏洞,例如点击劫持、XSS、MITM 等。
HTTP 严格传输安全 (HSTS)
Strict-Transport-Security
是一个 HTTP 响应标头,要求代理只能与 HTTPS 连接交互,而不能通过 HTTP 协议交互。
防止:
- 协议降级攻击
- Cookie劫持
值:
价值 | 描述 |
---|---|
max-age=SECONDS |
代理应记住此站点只能使用 HTTPS 进行交互的秒数 |
includeSubDomains |
将标头应用于站点的所有子域。 |
例子:
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
参考:
- https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
- https://www.owasp.org/index.php/HTTP_Strict_Transport_Security
框架选项
X-Frame-Options
此响应标头设置代理中的策略,以允许或拒绝在第三方网站的 iframe 中渲染您的内容。当浏览器加载 iframe 时,将检查此标头的值。
防止:
- 点击劫持
值:
价值 | 描述 |
---|---|
deny |
帧内无渲染 |
isameorigin |
如果原点不匹配,则不渲染 |
allow-from: DOMAIN |
如果框架从 DOMAIN 加载,则允许渲染 |
例子:
X-Frame-Options: deny
参考:
- https://www.owasp.org/index.php/Clickjacking
- https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options
- https://blogs.msdn.microsoft.com/ieinternals/2010/03/30/combating-clickjacking-with-x-frame-options/
XSS 保护
X-XSS-Protection
此保护标头可以设置值以禁用保护或阻止反射型 XSS 攻击。它是一个 XSS 过滤器。
防止:
- XSS 攻击
值:
价值 | 描述 |
---|---|
0 |
过滤器已禁用。 |
1 |
启用过滤器后,浏览器将清理页面 |
1; mode=block |
启用过滤器后,浏览器将阻止渲染页面 |
例子:
X-XSS-Protection: 1; mode=block
参考:
- https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
- https://developer.mozilla.org/es/docs/Web/HTTP/Headers/X-XSS-Protection
内容类型
X-Content-Type-Options
此标头可防止浏览器嗅探 MIME 类型。客户端浏览器将拒绝 MIME 类型不正确的响应,从而最大限度地降低上传内容可能被视为动态 HTML 文件的风险。
防止:
- 基于 MIME 类型混淆的攻击
- “执行”任意 HTML
值:
价值 | 描述 |
---|---|
nosniff |
阻止浏览器嗅探 MIME 类型。浏览器将信任服务器的 MIME 类型,如果错误则阻止该资源。 |
例子:
X-Content-Type-Options: nosniff
参考:
- https://en.wikipedia.org/wiki/Media_type
- https://blog.fox-it.com/2012/05/08/mime-sniffing-feature-or-vulnerability/
- https://developers.google.com/web/updates/2018/07/site-isolation
内容安全策略
Content-Security-Policy
此标头有助于防止 JavaScript、CSS、插件等恶意注入。此标头无法阻止特定攻击,但可以防止有人将任何恶意代码注入到您的应用运行。
防止:
- 跨站脚本
- 点击劫持
- 跨站点注入
值:
CSP 可以采用多种值。有关详细信息,请参阅MDN Web 文档。
例子:
Content-Security-Policy: script-src 'self'
参考:
- https://content-security-policy.com/
- https://developer.mozilla.org/en-US/docs/Web/Security/CSP
- https://www.owasp.org/index.php/Content_Security_Policy
功能策略
Feature-Policy
此标头可以启用或禁用各种浏览器功能,例如摄像头、全屏、麦克风等。
防止:
- 使用浏览器功能的第三方脚本。
值:
价值 | 描述 |
---|---|
accelerometer |
禁用浏览器加速度计 |
autoplay |
禁用播放器中的自动播放 |
camera |
禁用相机 |
microphone |
禁用麦克风 |
usb |
禁用对 USB 设备的访问 |
vibrate |
禁用振动功能 |
例子:
Feature-Policy: vibrate 'none'
参考:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy
- https://scotthelme.co.uk/a-new-security-header-feature-policy/
结论
HTTP 标头并不能保证您的应用免受攻击。但它们可以提供一个不容忽视的重要安全层。您现在就可以毫不费力地实现它。
以下列出了一些常用的库,它们可以帮助您在应用中设置安全标头。
摄影:Vivian Maier
文章来源:https://dev.to/andersonjoseph/security--htpp-headers-30c6