配置HTTP标头以确保安全的完整指南


出售安全记分卡的公司正在上升,它们在公司销售中的影响力正在增长。 此外,有些人对卖方的低安全等级感到困惑,而那些至少一次看过该等级的人拒绝购买-我与这些人交谈。


我研究了这些公司如何计算其他公司的安全绩效。 原来,他们正在考虑使用HTTP标头来提高安全性和IP地址的信誉。


IP地址的信誉基于黑名单和垃圾邮件发送者列表数据以及有关公共IP地址所有者的信息。 原则上,如果您的公司不发送垃圾邮件并且能够快速识别并阻止恶意实施,则应该是干净的。 使用HTTP安全标头的方式与Mozilla天文台的工作方式相同。


因此,大多数公司的评级主要​​取决于公共网站上包含的安全标题。


正确设置标题的时间不长(不需要进行认真的验证),但这可以提高网站的安全性,并有助于避免失去安全性不是空洞的客户


我怀疑上述验证方法的价值;此外,该服务的价格高昂。 该服务的提供者不太可能能够以规定的准确性确定资源的安全性。 但是,这种情况再次强调了坐下并花一些时间打开并设置正确的标题非常重要。


在本文中,我将讨论最常检查的标头,因为每个标头都会建议安全值并提供设置示例。 最后,我将举例说明常见应用程序和Web服务器的设置。


重要安全标题


内容安全政策


CSP用于通过确定可以下载哪些资源来防止跨站点脚本编写。 在整个列表中,该标题将比其余标题花费更多的时间来创建和正确支持,甚至还有更多其他风险。 在开发CSP时,请仔细检查-如果您突然阻止了正在使用的源,然后破坏了自己站点的功能。


对于初步版本,您可以使用一个很棒的工具-Mozilla浏览器Laboratory CSP扩展 。 将其安装在浏览器中,仔细研究您要为其创建CSP的站点,然后在您的站点上使用生成的CSP。 理想情况下,您仍然需要重新处理JavaScript,以便可以删除不安全的内联指令。


CSP似乎复杂而令人困惑,因此,如果您想更深入地研究该主题,请访问官方网站


您可以像这样预先配置CSP(在战场上,很可能需要进行很多修改)。 将域添加到站点的每个部分。


# Default to only allow content from the current site # Allow images from current site and imgur.com # Don't allow objects such as Flash and Java # Only allow scripts from the current site # Only allow styles from the current site # Only allow frames from the current site # Restrict URL's in the <base> tag to current site # Allow forms to submit only to the current site Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; 

严格的运输安全


此标头告诉浏览器您只能使用HTTPS协议进入网站-如果在您的网站上激活了HTTPS,则始终启用它。 将其包括在所有使用的子域中(如果有)。


 Strict-Transport-Security: max-age=3600; includeSubDomains 

X内容类型选项


由于有了此标头,浏览器可以遵守应用程序安装的MIME类型,从而有助于防止某些跨站点脚本攻击。


当浏览器错误地“猜测”网站上的内容类型时,例如,如果开发人员指定了“ HTML”页面并且浏览器看到了JavaScript并尝试相应地呈现页面,它还降低了应用程序意外行为的风险。 另外,由于有了此标头,浏览器始终保留服务器安装的MIME类型。


 X-Content-Type-Options: nosniff 

缓存控制


这将比其他的要差,因为对于不同类型的内容,您可能需要不同的缓存策略。


不应缓存任何敏感信息,例如用户页面或产品付款页面。 造成这种情况的原因之一是,另一位计算机用户没有按下“后退”按钮,没有阅读历史记录,也没有看到另一位用户的个人数据。


但是,您可以并且应该缓存那些很少更新的页面,例如静态资源(图像,CSS和JS文件)。 可以逐页配置缓存,也可以在服务器设置中使用正则表达式进行配置。


 # Don't cache by default Header set Cache-Control no-cache # Cache static assets for 1 day <filesMatch ".(css|jpg|jpeg|png|gif|js|ico)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> 

过期


此标头设置当前请求被缓存的时间。 如果启用了Cache-Control max-age标头,则将其忽略,因此我们仅在简单的扫描程序检查它的情况下才启用它-不包括缓存控件。


我们假设出于安全原因,浏览器不缓存任何内容,因此标头中的日期将始终是过去的日期。


 Expires: 0 

X帧选项


该标头可在iFrame中显示网站。


通过将您的网站放置在iFrame中,恶意资源就有机会进行点击劫持攻击-通过启动某种JavaScript诱使用户点击iFrame,然后开始使用其用户名(例如,某人单击恶意链接或按钮)与该资源进行交互甚至都不知道!)。


此标头应始终配置为失败,但如果您有意使用帧则除外。 然后,标头必须设置为相同的源。 如果默认情况下将框架与其他站点一起使用,则将第三方域列入白名单。


还应注意,此标头已由CSP frame-ancestors指令替换。 我建议暂时将其打开,但是只是为了关闭用于检查标题的工具,将来它们很可能会摆脱它。


 X-Frame-Options: deny 

访问控制允许来源


该标头告诉浏览器哪些第三方站点的外部代码有权向特定页面发出请求。 默认设置通常是正确的,但是您可以根据需要更改它们。


例如,站点A包含想要向站点B发出请求的某种JavaScript。如果标题允许站点A发出请求,则站点B应该对此请求做出响应。 如果需要配置许多源, 请参阅MDN页面上的详细信息


在这里,您可能会感到有些困惑,因此我制作了一个图表-说明此标头如何工作:



具有访问控制允许来源的数据流


 Access-Control-Allow-Origin: http://www.one.site.com 


确保仅通过HTTPS协议(带有加密)设置cookie,并且不能通过JavaScript访问它们。 仅当您的站点也应该支持HTTPS时,才可以发送这些文件。 您始终需要设置以下标志:


  • 安全的
  • 仅HTTP

Cookie定义示例:


 Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly 

在出色的Mozilla cookie文档中了解更多信息


X-XSS保护


该标头告诉浏览器中止检测到的跨站点脚本攻击。 通过打开它,您不会承担太大的风险,但是可以在将其启动到生产环境中之前对其进行测试。


 X-XSS-Protection: 1; mode=block 

Web服务器设置示例


通常,在服务器设置中,最好将标头添加到整个站点。 Cookies是一个例外,因为它们是在应用程序本身中定义的。


我建议您在将标头添加到站点之前,首先与天文台联系,或者手动查看标头-检查已安装的标头。 一些站点和服务器引擎会自行安装所有内容,因此只需实现所需的标头或更改所需的标头即可。


Apache配置


.htaccess中的示例Apache配置:


 <IfModule mod_headers.c> ## CSP Header set Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers Header set X-XSS-Protection: 1; mode=block Header set Access-Control-Allow-Origin: http://www.one.site.com Header set X-Frame-Options: deny Header set X-Content-Type-Options: nosniff Header set Strict-Transport-Security: max-age=3600; includeSubDomains ## Caching rules # Don't cache by default Header set Cache-Control no-cache Header set Expires: 0 # Cache static assets for 1 day <filesMatch ".(ico|css|js|gif|jpeg|jpg|png|svg|woff|ttf|eot)$"> Header set Cache-Control "max-age=86400, public" </filesMatch> </IfModule> 

Nginx配置


 ## CSP add_header Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self'; ## General Security Headers add_header X-XSS-Protection: 1; mode=block; add_header Access-Control-Allow-Origin: http://www.one.site.com; add_header X-Frame-Options: deny; add_header X-Content-Type-Options: nosniff; add_header Strict-Transport-Security: max-age=3600; includeSubDomains; ## Caching rules # Don't cache by default add_header Cache-Control no-cache; add_header Expires: 0; # Cache static assets for 1 day location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|ttf|eot)$ { try_files $uri @rewriteapp; add_header Cache-Control "max-age=86400, public"; } 

应用程序级别标题设置


如果您无权访问Web服务器或设置标头的要求很复杂,则可能必须在应用程序本身中对其进行配置。 通常,对于整个站点,这是使用中间件完成的,或者基于一次性设置每个请求的标头。


为简洁起见,在每个示例中仅包含一个标题。 您以相同的方式添加所有需要的内容。


节点和快递:


添加全局安装路径:


 app.use(function(req, res, next) { res.header('X-XSS-Protection', 1; mode=block); next(); }); 

Java和Spring


我对Spring的经验很少,但是Baeldung对于在Spring中设置标头有很好的指导。


p


我不熟悉各种PHP环境。 寻找用于查询的中间件。 对于单个请求,一切都很简单。


 header("X-XSS-Protection: 1; mode=block"); 

Python / Django


Django包含可自定义的安全中间件 ,它将为您完成所有这些工作。 首先激活它们。


某些页面的答案可以解释为字典。 Django有一种特殊的缓存处理方式,如果您想以这种方式配置缓存头,则需要熟悉它。


 response = HttpResponse() response["X-XSS-Protection"] = "1; mode=block" 

结论


设置标头是一个相对简单且快速的过程,但是它提高了站点安全级别-在数据保护方面,从跨站点脚本和单击劫持。


将来,由于您的安全等级将保持在该级别,因此您将保护自己免受交易失败的影响。 根据我所检查的参数进行评估的实践正在获得发展,在我看来,它在未来几年在销售领域中的作用只会越来越大。


让我知道我是否错过了一些重要的标题!

Source: https://habr.com/ru/post/zh-CN471746/


All Articles