本文整理自HSTS学习笔记、 HSTS详解、什么是中间人攻击?如何避免?这三篇的文章java
“中间人攻击(MiTM)”就是当数据离开一个端点前往另外一个端点时,传输的期间即是对数据失去控制的时候。当一个攻击者将本身置于两个端点并试图截获或阻碍数据传输时,便称为中间人(MiTM)攻击。web
谈及MiTM时,并非只有一种方式能够形成损害——答案是四种!通常说来,有嗅探、数据包注入、会话劫持和SSL剥离。apache
嗅探:嗅探或数据包嗅探是一种用于捕获流进和流出系统/网络的数据包的技术。网络中的数据包嗅探就好像电话中的监听。记住,若是使用正确,数据包嗅探是合法的;许多公司出于“安全目的”都会使用它。浏览器
数据包注入:在这种技术中,攻击者会将恶意数据包注入常规数据中。这样用户便不会注意到文件/恶意软件,由于它们是合法通信流的一部分。在中间人攻击和拒绝式攻击中,这些文件是很常见的。安全
会话劫持:你曾经遇到过“会话超时”错误吗?若是你进行过网上支付或填写过一个表格,你应该知道它们。在你登陆进你的银行帐户和退出登陆这一段期间便称为一个会话。这些会话一般都是黑客的攻击目标,由于它们包含潜在的重要信息。在大多数案例中,黑客会潜伏在会话中,并最终控制它。这些攻击的执行方式有多种。服务器
SSL剥离:SSL剥离或SSL降级攻击是MiTM攻击的一种十分罕见的方式,可是也是最危险的一种。众所周知,SSL/TLS证书经过加密保护着咱们的通信安全。在SSL剥离攻击中,攻击者使SSL/TLS链接剥落,随之协议便从安全的HTTPS变成了不安全的HTTP,从而截获用户的传输内容。网络
HSTS(HTTP Strict Transport Security) 是一种Web安全协议,它的做用是在本地强制客户端(如浏览器)使用HTTPS与服务器建立链接。服务器开启HSTS的方法是,当客户端经过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含STS(Strict-Transport-Security)字段。dom
语法规则工具
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
复制代码
各个参数的意义学习
Strict-Transport-Security
,并设置max-age等参数;Strict-Transport-Security
,并设置max-age等参数;所以,若是使用了HSTS,就能防止第一次80请求出问题,它的作法就是不通过网络而是直接在浏览器内部改写地址和请求方式。对应于以前的例子,就至关于你一开始就拥有了一只神奇的笔,用它写下来的文字只有你和银行才能看得懂,我却看不懂。而我拿着这些文字信息到银行后只能换一个保险柜,保险柜的密码只有你和银行知道,所以我也拿不到里面的钱。所以,HSTS有助于安全性的提高。
HSTS主要针对如下三个威胁:
HSTS针对以上三个威胁的解决方案:
如前所述,若没有使用HSTS,虽然会出现安全警告,可是仍可选择继续不安全的链接。而若是使用了HSTS,则没法继续不安全的连接。
利用HSTS,还能够节省一次302/301跳转请求。若是浏览器已经记住对应网址的HSTS规则,每次对其进行http访问时,都会在浏览器内部直接307跳转到https,不用先80到服务器而后再被告知443端口访问,节省资源和时间。
最后,使用HSTS的优势是能够强制客户端使用HTTPS访问页面,避免中间人劫持;免去一次302/301的跳转请求,直接进行HTTPS链接,节省时间和资源。更加安全和高效。可是它也存在一些缺点:
修改配置文件,如/etc/apache2/sites-enabled/websites.conf和/etc/apache2/httpd.conf
,在VirtualHost中增长如下内容:
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
</VirtualHost>
复制代码
4.2 Lighttpd
修改配置文件,如/etc/lighttpd/lighttpd.conf
,而后重启Lighttpd便可:
server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
setenv.add-response-header = ("Strict-Transport-Security" => "max-age=63072000; includeSubdomains; ")
}
复制代码
4.3 Nginx
将如下内容添加到https的配置文件中便可:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; ";
复制代码
利用Chrome的开发者工具,分别对
进行实验,能够发现taobao, douban, google已经开始使用HSTS,并且在输入上面网址的时候能够看到307状态码,在浏览器内部切换到https进行访问。而访问http://www.baidu.com的时候,仍是只有302,屡次访问仍旧如此,说明百度首页尚未使用HSTS,还是先80端口访问而后服务器再返回302告诉浏览器要用443端口进行https访问。