如何在IIS7 +中启用HTTP严格传输安全性(HSTS)

发布时间:2017/5/18 15:12:40 打印 字号:

我收到了一个网站I(继承但是帮助)管理的一个奇怪的重定向循环的报告。这些报告仅来自Chrome和Firefox用户,并且刚刚在上周突然开始,但是该网站的代码在至少3年内没有发生变化,也许更长。


image_5fdda372-7849-449e-bec7-194a1e28d0f6 (1).png


这里发生了什么?那么这是一个重定向环路,LOL。但是什么种类的重定向?

我们知道这些重定向,对吧?

302 - 对象移动 - 在这里查看这个URL!

301 - 永久移动 - 再也不会在这里。转到这个URL!


image_19b40fe1-e6ed-4a14-8c65-8d66ce2ac225.png



但还有另一种重定向。

307 - 内部重定向或“重定向方法” - 有人早些时候告诉我过去这里,所以我要去那里,而不跟服务器交谈。Imma重定向并保持使用相同的VERB。这意味着您可以重定向POST,而不需要额外的安全隐患。

image_abc0e444-e7e5-43cf-8a50-03ba6f6648ce.png

注意307的原因!HSTS。那是什么?

HSTS:严格的运输安全

一旦您通过HTTPS访问了站点,HSTS就是让您无意中从SSL切换AWAY。例如,您不希望通过HTTPS访问您的银行,确认您是安全的,只是为了注意您在某些时候使用不安全的HTTP URL。这是怎么发生的,你会问自己。

但是,我们当天没有写一堆代码来强制HTTPS?

当然,但是这仍然要求我们至少要一次服务器,通过HTTP ...,每隔一段时间,用户就会进入不安全的页面,然后重定向。

HSTS是一种“认真的方式”,在HTTPS上保留这段时间(如周),如果有人说另外说,做内部重定向并且安全。

一些网站和博客说,要在IIS7 +中实现这一点,您应该只需在您的web.config中添加HSTS的CustomHeader需求。这是不正确的

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
        </customHeaders>
    </httpProtocol>
</system.webServer>

在技术上不是规范。这里的问题是您即使不在HTTPS时也始终发送标题。

该HSTS(RFC6797)规范说

HTTP主机通过向UA(用户代理)发出HSTS策略来声明其本身为HSTS主机,HSTS策略由

安全传输(例如,TLS)上的严格传输安全HTTP响应头字段表示和传送。

您不应该通过HTTP发送严格传输安全性,只是HTTPS。发信时,他们可以相信你。

而是将其重定向到您的规范URL的安全版本,然后发送严格传输安全性。来自Doug Wilson的StackOverflow是一个很好的答案。

请注意,第一条规则指向不安全的位置。第二个添加了Strict-Transport-Security的HTTP头。我唯一可能会改变的是正式规范化 www。前缀与裸域。


<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <system.webServer>

        <rewrite>

            <rules>

                <rule name="HTTP to HTTPS redirect" stopProcessing="true">

                    <match url="(.*)" />

                    <conditions>

                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />

                    </conditions>

                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"

                        redirectType="Permanent" />

                </rule>

            </rules>

            <outboundRules>

                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">

                    <match serverVariable="RESPONSE_Strict_Transport_Security"

                        pattern=".*" />

                    <conditions>

                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />

                    </conditions>

                    <action type="Rewrite" value="max-age=31536000" />

                </rule>

            </outboundRules>

        </rewrite>

    </system.webServer>

</configuration>

还要注意,HTTP严格传输安全性也来到IE和Microsoft Edge,所以它是一个重要的技术要了解。

我的旧(继承)网站发生了什么?那么一些年前,想确保一个特定的端点/页面在网站上被提供HTTPS,所以他们写了一些代码来做到这一点。没问题吧?结果,他们还增加了其他人,有效地促使每个人都HTTP,而不是仅仅使用电流/继承协议。

当严格传输安全性在整个域的根级别打开时,这是一个问题。现在人们会在网站上显示并获得这种互动:

GET http:// foo / web

301到http:// foo / web /(规范结束斜杠)

307到https:// foo / web /(使用方法重定向,换句话说,内部重定向到安全并继续使用相同的动词(GET或POST))

301到http:// foo / web(内部的那个是愚蠢的和遗留的)

冲洗,重复

这里的教训是什么?在域级别上启用此功能的配置更改当然会影响所有子目录和应用程序,包括我们的旧目录和应用程序。我们的遗留应用尚未准备就绪。

确保在所有网站上实施HTTP严格传输安全(HSTS),但请务必测试并知道您的重定向。