如何实现安全性HTTP标头以防止漏洞()

本文概述

  • X-XSS-Protection
  • HTTP Strict Transport Security
  • X-Frame-Options
  • X-Content-Type-Options
  • HTTP Public Key Pinning
  • Content Security Policy
  • X-Permitted-Cross-Domain-Policies
  • Referrer-Policy
  • Expect-CT
  • Feature-Policy
你是否知道大多数安全漏洞都可以通过在响应标头中实现必要的标头来解决?
安全与你网站的内容和SEO一样重要, 并且由于配置错误或缺乏保护, 数以千计的网站被黑客入侵。如果你是网站所有者或安全工程师, 并希望保护你的网站免受Clickjacking, 代码注入, MIME类型, XSS等的攻击, 那么本指南将为你提供帮助。
在本文中, 我将讨论在多个Web服务器, 网络边缘和CDN提供程序中实现的各种HTTP标头, 以更好地保护网站。
笔记:
  • 建议你在进行更改之前先备份配置文件
  • 某些标题可能并非在所有浏览器上都受支持, 因此请在实现之前检查一下兼容性。
  • 必须在Apache中启用Mod_headers才能实现这些头。确保在httpd.conf文件中未注释以下行。
LoadModule headers_module modules/mod_headers.so

  • 实现后, 你可以使用安全头在线工具来验证结果。
使用WordPress ?:你可能想尝试使用HTTP标头插件, 该插件可以处理这些标头等等。
安全的HTTP标头
  • X-XSS-Protection
  • HTTP Strict Transport Security
  • X-Frame-Options
  • X-Content-Type-Options
  • HTTP Public Key Pinning
  • Content Security Policy
  • X-Permitted-Cross-Domain-Policies
  • Referrer-Policy
  • Expect-CT
  • Feature-Policy
X-XSS-Protection X-XSS-Protection标头可以防止某种程度的XSS(跨站点脚本)攻击, 并且与IE 8 +, Chrome, Opera, Safari和Android兼容。
Google, Facebook, Github使用此标头, 并且大多数渗透测试咨询公司都将要求你实现此标头。
你可以通过四种方法配置此标头。
参数值 含义
0 XSS过滤器已禁用
1 如果检测到攻击, 则启用XSS筛选器并清理页面
1; 模式=阻止 启用XSS筛选器, 并在检测到攻击时阻止呈现页面
1; report = http://example.com/report_URI 启用XSS筛选器, 并在检测到攻击时报告违规
让我们在以下网络服务器中实现1; mode = block。
Apache HTTP服务器
在Apache Web服务器的httpd.conf中添加以下条目
Header set X-XSS-Protection "1; mode=block"

重新启动Apache进行验证
Nginx的
在nginx.conf中的http块下添加以下内容
add_header X-XSS-Protection "1; mode=block";

需要重启Nginx才能将其反映在你的网页响应标头中。
最大CDN
如果你使用的是MaxCDN, 那么添加标头就很容易且即时。
转到Edge Rules > > 单击” New Rule” , 然后从下拉列表中选择” Add X-XSS-Protection Header” 。
如何实现安全性HTTP标头以防止漏洞()

文章图片
微软IIS
  • 打开IIS管理器
  • 选择你需要启用标题的站点
  • 转到” HTTP响应头” 。
  • 在操作下单击” 添加”
  • 输入名称, 值, 然后单击确定
如何实现安全性HTTP标头以防止漏洞()

文章图片
  • 重新启动IIS以查看结果
HTTP Strict Transport Security HSTS(HTTP Strict Transport Security性)标头, 以确保来自浏览器的所有通信均通过HTTPS(HTTP安全)发送。这样可以防止HTTPS点击提示, 并将HTTP请求重定向到HTTPS。
在实现此标头之前, 你必须确保可以通过HTTPS访问所有网站页面, 否则将被阻止。
浏览器的所有主要最新版本(例如IE, Firefox, Opera, Safari和Chrome)都支持HSTS标头。有三个参数配置。
参数值 含义
最大年龄 告诉浏览器请求仅通过HTTPS可用的持续时间(以秒为单位)。
includeSubDomains 该配置也对子域有效。
预载 如果你希望将域包含在HSTS预加载列表中, 请使用
因此, 让我们以配置HSTS一年的示例为例, 其中包括域和子域的预加载。
Apache HTTP服务器
你可以通过在httpd.conf文件中添加以下条目来在Apache中实现HSTS。
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

重新启动Apache以查看结果
Nginx的
要在Nginx中配置HSTS, 请在server(SSL)指令下的nginx.conf中添加下一个条目
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

和往常一样, 你需要重新启动Nginx进行验证
云耀斑
如果你使用的是Cloudflare, 则只需单击几下即可启用HSTS。
  • 登录到Cloudflare并选择站点
  • 转到” 加密” 标签, 然后单击” 启用HSTS” 。
如何实现安全性HTTP标头以防止漏洞()

文章图片
选择所需的设置, 更改将即时应用。
微软IIS
启动IIS管理器, 并通过转到相应站点的” HTTP响应标头” 来添加标头。
如何实现安全性HTTP标头以防止漏洞()

文章图片
重新启动网站
X-Frame-Options 使用X-Frame-Options标头可防止你网站上的Clickjacking漏洞。通过实现此标头, 可以指示浏览器不要将你的网页嵌入frame / iframe。这在浏览器支持方面有一些限制, 因此你必须在实现之前进行检查。
你可以配置以下三个参数。
参数值 含义
SAMEORIGIN 内容的框架/ iframe仅允许来自同一网站来源。
拒绝 阻止任何域使用frame / iframe嵌入你的内容。
允许 只允许在特定的URI上构建内容框架。
让我们看一下如何实现” 拒绝” , 以便没有域嵌入网页。
阿帕奇
在httpd.conf中添加以下行, 然后重新启动Web服务器以验证结果。
Header always append X-Frame-Options DENY

Nginx的
在服务器指令/块下的nginx.conf中添加以下内容。
add_header X-Frame-Options” DENY” ;
重新启动以验证结果
F5 LTM
使用以下内容创建一个iRule并将其与相应的虚拟服务器关联。
when HTTP_RESPONSE {HTTP::header insert "X-FRAME-OPTIONS" "DENY"}

你无需重新启动任何操作, 更改会立即反映出来。
WordPress的
你也可以通过WordPress实现此标头。在wp-config.php文件中添加以下内容
header('X-Frame-Options: DENY);

如果你不满意编辑文件, 则可以使用此处说明或上面提到的插件。
微软IIS
通过转到相应站点的” HTTP响应标头” 来添加标头。
如何实现安全性HTTP标头以防止漏洞()

文章图片
重新启动站点以查看结果。
X-Content-Type-Options 通过将此标头添加到网页的HTTP响应中, 可以防止MIME类型的安全风险。具有此标头可指示浏览器将文件类型视为已定义, 并禁止内容嗅探。你只需添加” nosniff” 一个参数。
让我们看看如何宣传此标头。
Apache
你可以通过在httpd.conf文件中添加以下行来实现
Header set X-Content-Type-Options nosniff

不要忘记重启Apache网络服务器以使配置生效。
Nginx
在服务器块下的nginx.conf文件中添加以下行。
add_header X-Content-Type-Options nosniff;

和往常一样, 你必须重新启动Nginx来检查结果。
微软IIS
打开IIS并转到HTTP响应头
单击添加并输入名称和值
如何实现安全性HTTP标头以防止漏洞()

文章图片
单击” 确定” , 然后重新启动IIS以验证结果。
HTTP Public Key Pinning 通过固定证书来最大程度地降低中间人(MITM)的攻击风险。 HPKP(HTTP公共密钥固定)标头可以做到这一点。
你可以固定根证书公钥或即时证书。在撰写本文时, HPKP当前可在Firefox和Chrome中运行, 并支持SHA-256哈希算法。
有四种可能的参数配置。
参数值 含义
report-uri =” 网址” 如果验证失败, 请报告到指定的URL。这是可选的。
pin-sha256 =” sha256key” 在此指定图钉
最大年龄= 浏览器可以记住只有使用固定键之一才能访问该网站的时间(以秒为单位)。
IncludeSubDomains 这也适用于子域。
我们来看看来自facebook.com的HPKP标头示例
public-key-pins-report-only:max-age=500; pin-sha256="WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18="; pin-sha256="r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E="; pin-sha256="q4PO2G2cbkZhZ82+JgmRUyGMoAeozA+BSXVXQWB8XWQ="; report-uri=http://reports.fb.com/hpkp/

如果你需要在网站上实现此操作, 请访问Scott Helme编写的实现指南。
Content Security Policy 通过在网页HTTP响应中实现内容安全策略(CSP)标头, 防止XSS, 点击劫持, 代码注入攻击。 CSP指示浏览器将允许的内容加载到网站上。
所有浏览器都不支持CSP, 因此你必须在实现之前进行验证。你可以通过三种方式获得CSP标头。
  1. 内容安全策略–级别2 / 1.0
  2. X-Content-Security-Policy –已弃用
  3. X-Webkit-CSP –已弃用
如果你仍在使用已弃用的服务器, 则可以考虑升级到最新的服务器。
有多种参数可以实现CSP, 你可以参考OWASP以获得一个想法。但是, 让我们看一下两个最常用的参数。
参数值 含义
default-src 从定义的源加载所有内容
脚本源 仅从定义的源中加载脚本
以下示例将来自同一来源的所有内容加载到各种Web服务器中。
阿帕奇
在httpd.conf文件中添加以下内容, 然后重新启动Web服务器以使其生效。
Header set Content-Security-Policy "default-src 'self'; "

Nginx的
在nginx.conf文件的服务器块中添加以下内容
add_header Content-Security-Policy "default-src 'self'; ";

微软IIS
【如何实现安全性HTTP标头以防止漏洞()】在IIS管理器中转到你各自站点的HTTP响应标头, 然后添加以下内容
如何实现安全性HTTP标头以防止漏洞()

文章图片
X-Permitted-Cross-Domain-Policies 使用Adobe产品(例如PDF, Flash等)?你可以实现此标头, 以指示浏览器如何处理跨域请求。通过实现此标头, 你可以限制从其他域加载网站的资产, 以避免资源滥用。
有一些可用的选项。
描述
none 禁止政策
仅主机 只允许主策略
所有 一切都被允许
仅按内容 仅允许某种类型的内容。示例– XML
仅按ftp 仅适用于FTP服务器
阿帕奇
如果你不想允许任何政策。
Header set X-Permitted-Cross-Domain-Policies "none"

你应该看到如下所示的标题。
如何实现安全性HTTP标头以防止漏洞()

文章图片
Nginx的
并且, 假设你需要实现仅主机, 然后在服务器块下的nginx.conf中添加以下内容。
add_header X-Permitted-Cross-Domain-Policies master-only;

和结果。
如何实现安全性HTTP标头以防止漏洞()

文章图片
Referrer-Policy 想要控制网站的引荐来源网址政策?有一定的隐私和安全利益。但是, 并非所有浏览器都支持所有选项, 因此请在实现之前查看你的要求。
Referrer-Policy支持以下语法。
描述
无推荐人 推荐人信息不会随请求一起发送。
降级时无推荐人 默认设置, 其中引荐来源网址以与HTTP到HTTP, HTTPS到HTTPS相同的协议发送。
不安全网址 完整的URL将与请求一起发送。
同源 推荐人只会发送给同一原始站点。
严格起源 仅在协议为HTTPS时发送
严格起源于交叉起源 完整的URL将通过严格的协议(例如HTTPS)发送
起源 在所有请求中发送原始URL
跨源起源 发送来自相同来源的完整网址。但是, 在其他情况下, 仅发送原始URL。
阿帕奇
如果要设置无引荐来源, 可以添加以下内容。
Header set Referrer-Policy "no-referrer"

并且在重启之后, 你应该在响应头中。
如何实现安全性HTTP标头以防止漏洞()

文章图片
Nginx的
假设你需要实现同源, 因此必须添加以下内容。
add_header Referrer-Policy same-origin;

配置完成后, 你应该具有以下结果。
如何实现安全性HTTP标头以防止漏洞()

文章图片
Expect-CT 仍处于实验状态的新标头将指示浏览器验证与Web服务器的连接以实现证书透明(CT)。 Google的这个项目旨在修复SSL / TLS证书系统中的某些缺陷。
以下三个变量可用于Expect-CT标头。
描述
最大年龄 在几秒钟内, 浏览器应将策略缓存多长时间。
执行 强制执行策略的可选指令。
报告网站 当未收到有效的证书透明性时, 浏览器将报告发送到指定的URL。
阿帕奇
假设你要执行此政策, 报告并缓存12小时, 那么你必须添加以下内容。
Header set Expect-CT 'enforce, max-age=43200, report-uri="https://somedomain.com/report"'

并且, 这是结果。
如何实现安全性HTTP标头以防止漏洞()

文章图片
Nginx的
如果你要报告并缓存1小时该怎么办?
add_header Expect-CT 'max-age=60, report-uri="https://mydomain.com/report"';

输出将是。
如何实现安全性HTTP标头以防止漏洞()

文章图片
Feature-Policy 控制浏览器的功能, 例如地理位置, 全屏, 扬声器, USB, 自动播放, 扬声器, 振动, 麦克风, 付款, VR等, 以在Web应用程序中启用或禁用。
阿帕奇
假设你需要禁用全屏功能, 并且可以在httpd.conf或apache2.conf中添加以下内容。
Header always set Feature-Policy "fullscreen 'none' "

如何在一行中添加多个功能?
也有可能!
Header always set Feature-Policy "fullscreen 'none'; microphone 'none'"

重新启动Apache HTTP以查看结果。
如何实现安全性HTTP标头以防止漏洞()

文章图片
上面的代码将指示浏览器禁用全屏和麦克风。
Nginx的
再举一个例子-禁用振动功能。
add_header Feature-Policy "vibrate 'none'; ";

或者, 禁用地理位置, 摄像头和扬声器。
add_header Feature-Policy "geolocation 'none'; camera 'none'; speaker 'none'; ";

这是重启Nginx之后的输出。
如何实现安全性HTTP标头以防止漏洞()

文章图片
所有Nginx配置都位于nginx.conf或你使用的任何自定义文件中的http块下。
总结
保护网站的安全是一项挑战, 我希望通过实现上述标头, 可以增加安全性。如果你正在运营一个商务站点, 那么你还可以考虑使用像SUCURI这样的WAF云来保护你的在线业务。 SUCURI的优点在于, 它既提供安全性又提供性能。

    推荐阅读