中间人攻击 (MITM)
在中间人(MITM)攻击中,攻击者会插入到两个正在尝试通信的实体之间。
在 Web 上,MITM 攻击通常发生在用户浏览器和服务器之间,并允许攻击者查看并可能修改通过 HTTP 交换的任何流量。
攻击者执行 MITM 攻击的一种常见方式是在公共场所(如咖啡馆或机场)设置一个无线接入点,然后等待受害者连接到它。如果受害者连接了,攻击者就能读取和修改用户浏览器与他们连接的任何网站之间交换的任何数据。
防范 MITM 的措施
防范 MITM 的主要方法是通过 HTTPS(基于 TLS 的 HTTP)来提供您的网站。HTTPS 可阻止攻击者读取流量,或以可预测的方式修改流量。
您应该通过 HTTPS 提供所有页面,而不仅仅是您认为特别敏感的页面。
使用安全的 TLS 配置
要支持 HTTPS,网站需要一个 TLS 证书。Let's Encrypt 是一个广泛使用的非营利性证书颁发机构,它颁发免费的 TLS 证书。
并非所有 TLS 配置都同样安全:如果您需要配置自己的服务器,请查阅 Mozilla 的 TLS 推荐配置等资源。
现代 Web 托管服务默认或通过配置设置为您支持 HTTPS。在这种情况下,托管服务可能会代表您管理您的证书并配置服务器。
通过 HTTPS 加载子资源
当页面加载资源(脚本、样式表、字体、图片等)时,这些资源也应该通过 HTTPS 提供。如果页面通过 HTTPS 加载,但尝试通过 HTTP 加载资源,则浏览器将尝试升级加载请求以使用 HTTPS,或者会阻止该请求:这被称为 混合内容阻止。
如果您无法更新代码以从 HTTPS URL 加载资源(例如,因为您的 HTML 已存档),您的服务器可以设置一个 内容安全策略,其中包含 upgrade-insecure-requests 指令,浏览器将自动将这些请求升级到 HTTPS。
在升级 HTTP 请求时使用 HSTS
即使您的网站仅通过 HTTPS 提供,用户仍可能通过 HTTP 请求它:例如,在地址栏中输入 http://example.org。为了使您的网站在这种情况下正常工作,您可以监听 HTTP 请求并使用 301 Moved Permanently 响应将请求重定向到 HTTPS 版本。
但是,这为攻击者提供了拦截初始交换的机会,然后阻止 HTTPS 升级发生。这有时被称为SSL 剥离攻击(SSL 是 TLS 的前身)。
为了降低此攻击的风险,您的服务器还应发送 Strict-Transport-Security HTTP 响应头(也称为 HSTS):这会告知客户端您希望它们使用 HTTPS,并且在任何后续访问中,即使是通过 HTTP URL 访问,浏览器也会直接使用 HTTPS 进行连接。
使用 HSTS 后,SSL 剥离仅在浏览器首次尝试连接到您的网站时(或者,由于 HSTS 有有效期,在浏览器中的 HSTS 记录过期后的首次尝试时)才会发生。为了保护您的网站,即使是在首次连接或 HSTS 记录过期时,Chrome 也会维护一个称为 HSTS 预加载列表的域名列表:如果一个域名在此列表中,Chrome 将始终将 HTTP 请求升级到 HTTPS,效果如同服务器已发送 HSTS 头一样。Safari 和 Firefox 也有类似的行为,使用源自 Chrome 列表的列表。
防御总结清单
- 通过 HTTPS 提供您网站的所有页面和子资源。
- 如果您想将 HTTP 请求重定向到 HTTPS,请使用 HSTS,并考虑将您的网站添加到 HSTS 预加载列表。