• HSTS(HTTP 严格传输安全)


    了解为什么 HTTPS 不足以保护您的网站免受网络攻击以及 HSTS 标头如何解决问题。让我们开始!

    什么是 HSTS?

    HTTP Strict Transport Security 是一种可选的浏览器安全功能,可防止浏览器与域建立任何未加密的连接。

    通过未加密的连接,我的意思是使用http代替https(或ws代替wssWebSockets)。

    Strict-Transport-Security您可以使用标题为您的网站启用保护,如下所示:

    Strict-Transport-Security: 
    

    有 3 个选项max-ageincludeSubdomainspreload。我们将在一分钟内讨论这些内容,但首先,让我解释一下为什么在 Web 应用程序中实现 HSTS 如此重要。

    为什么 HSTS 很重要?

    HSTS 标头可防止针对您的 Web 应用程序的网络攻击。如果您不使用它,以下是您的应用程序的工作方式:

    场景 1:没有 HSTS,没有攻击者

    1. 用户输入www.example.com

    1. 用户的浏览器向http://www.example.com/发送未加密的 HTTP 请求

     

     

    1. 网络服务器返回一个重定向到https://www.example.com

     

    1. 用户的浏览器向https://www.example.com/发送加密的 HTTPS 请求。

    1. 网络服务器返回登录页面。

    1. 用户输入他们的用户名和密码,浏览器通过安全的 TLS 连接将其安全地发送到网络服务器。

    但是如果网络上有攻击者怎么办?HTTPS 没有帮助。让我告诉你我的意思。

    场景 2:没有 HSTS,网络上有攻击者

    1. 用户输入www.example.com

     

     

    1. 用户的浏览器向http://www.example.com/发送未加密的 HTTP 请求

     

     

    1. 攻击者截获这个未加密的请求并从真实服务器返回登录页面。至关重要的是,连接仍然是未加密的。

    1. 用户通过未加密的连接将他们的用户名和密码直接提供给攻击者。

    哎呀。这不好。

    现在让我们看看当 HSTS 标头保护 Web 应用程序时会发生什么。

    场景 3:HSTS

    1. 用户输入www.example.com

     

     

    1. 该网站使用 HSTS,因此用户的浏览器会立即向https://www.example.com/发送加密的 HTTPS 请求。攻击者没有机会。

    1. 网络服务器返回登录页面。

    1. 用户输入他们的用户名和密码,浏览器通过安全的 TLS 连接安全地发送。

    看看 HSTS 如何阻止攻击?但现在你可能会问...

    如果用户是第一次访问该网站怎么办?

    一个很好的问题!如果用户是第一次访问该网站,用户的浏览器还没有机会看到 HSTS 标头。

    在这种情况下,攻击仍然是可能的,因为攻击者在实际的 Web 服务器有机会告诉用户的浏览器使用 HSTS 之前接管了连接。

    幸运的是,有一个解决方案,我保证你会在本文结束时了解它的一切。它与第三个选项有关preload,但让我们先看看其他两个选项!

    最大年龄参数

    HSTS 标头中的第一个参数是max-age. 它是您希望浏览器在看到标头后记住标头的时间(以秒为单位)。

    例如,以下标头将为发送它的域启用 HSTS 一分钟。然后,浏览器会在 60 秒内拒绝与域建立任何未加密的连接。

    Strict-Transport-Security: max-age=60
    

    这么短的时间一般不是很有用。像这样看到一年或两年的值更为常见:

    1. # 1 year
    2. Strict-Transport-Security: max-age=31536000
    1. # 2 years
    2. Strict-Transport-Security: max-age=63072000

    浏览器每次看到标题都会刷新时间。

    ☝️注意

    在生产环境中实施 HSTS 时,最好从小规模开始max-age,然后慢慢将其提升到一年或两年。这样,如果发生故障,您可以快速恢复。

    取消 HSTS

    max-age参数的第二个用例是取消 HSTS,如果您想摆脱它。通过返回max-age零,浏览器将在看到标题后删除保护。

    1. # Cancel HSTS
    2. Strict-Transport-Security: max-age=0

    includeSubdomains 参数

    第二个参数是includeSubdomains。默认情况下,HSTS 标头只会影响为其提供服务的域。也就是说,如果https://www.example.com发送它,那么只会www.example.com被保护,foo.www.example.com不会。

    要包含子域,请includeSubdomains像这样添加:

    1. # Store for 2 years, apply also to subdomains
    2. Strict-Transport-Security: max-age=6307200; includeSubdomains

    ☝️注意

    includeSubdomains指令是预加载的要求,我们将在接下来查看。

    HSTS 预加载

    第三个参数preload有助于 HSTS 预加载。

    正如我之前提到的,预加载是一种机制,即使用户第一次访问该网站,您也可以使用该机制使用 HSTS 标头保护您的网站。

    它可以让您告诉 Google 保护您的网站,他们会看到所有主要浏览器都会更改其源代码以为您的域预加载 HSTS 标头。

    可不是闹着玩的!您可以在此处查看 JSON 文件。如果你仔细看,你会发现 appsecmonkey 在那里!

    { "name": "appsecmonkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },

    不过,为您的域启用预加载有几个先决条件。

    首先,您必须使用preload指令提供 HSTS 标头。此外,max-age必须 >= 一年,并且您必须添加includeSubdomains.

    1. # Store for two years, also apply to subdomains, enable preloading
    2. Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

    此外,您的域必须在 HTTPS 端口 (443) 上返回有效的 TLS 证书,并在端口 80 上重定向到 HTTPS(如果启用了端口 80)。

    当您满足这些要求时,请访问HSTS Preload List Submission并提交您的域,如下所示:

     

    结论

    HTTPS 不足以保护您的 Web 应用程序的用户免受网络攻击。只要互联网上有未加密的网站,浏览器供应商就不能仅仅完全禁用未加密的连接。

    幸运的是,对于不想要任何未加密连接的网站,有一种选择加入机制。这就是 HSTS 标头。

    在生产中实施 HSTS 时,最好从缓慢开始,max-age然后慢慢提高。

    最后,可以(并且强烈推荐)将您的 HSTS 标头预加载到主要 Web 浏览器的源代码中,方法是将您的域提交到 hstspreload.org。但在你这样做之前要三思而后行;取消是一个缓慢而痛苦的过程。

     

     

     

     

     

  • 相关阅读:
    多线程(虚拟地址空间)
    clm大气强迫数据制作
    mysql常用操作集合
    C#打包表情图片至Dll文件中供winform中调用
    利用Spire.Pdf实现PDF添加印章的操作
    第一章 - 第11节- 因特网概述 - 课件
    java 使用documents4j将XML转为pdf文件的方式
    python离线安装第三方库、及其依赖库(单个安装,非批量移植)
    OMV6 安装Extras 插件失败的解决方法
    Django测试与持续集成:从入门到精通
  • 原文地址:https://blog.csdn.net/allway2/article/details/126703914