何为流量劫持

前不久小米等六家互联网公司发表联合声明,呼吁运营商打击流量劫持。流量劫持最直观的表现,就是网页上被插入了一些乱七八糟的广告/弹窗之类的内容。比如这样:

网页右下角被插入了游戏的广告。

流量劫持总体来说属于中间人攻击(Man-in-the-Middle Attack,MITM)的一种,本质上攻击者在通信两端之间对通信内容进行嗅探和篡改,以达到插入数据和获取关键信息的目的。目前互联网上发生的流量劫持基本是两种手段来实现的:

  • 域名劫持:通过劫持掉域名的 DNS 解析结果,将 HTTP 请求劫持到特定 IP 上,使得客户端和攻击者的服务器建立 TCP 连接,而非和目标服务器直接连接,这样攻击者就可以对内容进行窃取或篡改。在极端的情况下甚至攻击者可能伪造目标网站页面进行钓鱼攻击。
  • 直接流量修改:在数据通路上对页面进行固定的内容插入,比如广告弹窗等。在这种情况下,虽然客户端和服务器是直接建立的连接,但是数据内容依然可能遭到野蛮破坏。

能够实施流量劫持的根本原因,是 HTTP 协议无法对通信对方的身份进行校验以及对数据完整性进行校验。如果能解决这个问题,则流量劫持将无法轻易发生。

关于流量劫持的更多危害案例,可以参考:如何看待小米等联合声明:呼吁运营商严格打击流量劫持?( https://www.zhihu.com/question/38861118 )

HTTPS 如何防止劫持

HTTPS,是 HTTP over SSL 的意思,提到 HTTPS 就不得不先简单描述一下 SSL/TLS 协议。SSL 协议是 Netscape 在 1995 年首次提出的用于解决传输层安全问题的网络协议,其核心是基于公钥密码学理论实现了对服务器身份认证、数据的私密性保护以及对数据完整性的校验等功能。1999 年 IETF 将 SSL 3.0 标准化,是为 TLS 1.0 版本,目前 TLS 协议的最新版本是 1.2 版本,TLS 1.3 标准正在制定中。为了方便,下文将 SSL/TLS 协议都简称为 SSL 协议。

SSL 协议在 HTTP 请求开始之前增加了握手的阶段,其粗略流程如下图所示:

  • 在 SSL 握手阶段,客户端浏览器会认证服务器的身份,这是通过“证书”来实现的,证书由证书权威(CA)为某个域名签发,可以理解为网站的身份证件,客户端需要对这个证件进行认证,需要确定该证书是否属于目标网站并确认证书本身是否有效。最后在握手阶段,通信的双方还会协商出一个用于加密和解密的会话密钥。
  • SSL 握手阶段结束之后,服务器和客户端使用协商出的会话密钥对交互的数据进行加密/解密操作,对于 HTTP 协议来说,就是将 HTTP 请求和应答经过加密之后再发送到网络上。

由此可见,因为 SSL 协议提供了对服务器的身份认证,所以 DNS 劫持导致连接错误服务器的情况将会被发现进而终止连接,最终导致 DNS 挟持攻击无法实现。此外 SSL 协议还提供数据的加密和完整性校验,这就解决了关键信息被嗅探以及数据内容被修改的可能。

如何部署 HTTPS

要将网站进行 HTTPS 支持以达到防劫持的效果,首先需要的是为网站的域名搞一张证书。这个证书必须是由知名 CA 所签发的,这是因为知名 CA 的根证书广泛的存在于大多数浏览器和操作系统中,因此可以被客户端用来校验网站证书是否合法。

传统 CA 的证书签发流程大体相同,基本上都是根据证书认证的级别,进行一系列不同流程的认证,然后认证通过后申请者缴纳相应的费用就可以或得到证书。这个流程相对比较繁琐,尤其是对于个人和小型网站管理者来说搞起来也确实麻烦。这里推荐一种新型的方法——使用 Let’s Encrypt 的自动化服务获取免费的证书。

使用 Let’s Encrypt 的自动化服务获取免费的证书

Let’s Encrypt 项目是由 ISRG 提供的免费 CA 服务,其主要目的是减少证书获取的难度,将证书的签发/续签/作废等操作进行自动化处理。Let’s Encrypt 的使用方法非常简单,按照文档中步骤操作即可。如需进一步了解如何使用 Let’s Encrypt 自动获取免费证书,可以参考:用 Let’s Encrypt 获取免费证书 (

https://www.paulyang.cn/blog/archives/39?spm=5176.blog2666.yqblogcon1.11.i02BAh )

在获得到证书(以及对应的私钥)之后,主要有如下几种方法来使用:

  1. 直接在 Web 服务器上部署证书和私钥,相关 apache 或 nginx 都有大量的文档说明,在此就不赘述了。
  2. 在服务器集群的接入层/反向代理处部署证书和私钥,例如阿里云的 CDN, SLB 和高防 IP 等产品均提供 HTTPS 支持,可以直接上传证书和私钥就可以实现网站的 HTTPS 改造。

阿里云的 HTTPS 支持

阿里巴巴在 2015 年的双 11 期间,成功的使用了全站范围(包括淘宝、天猫等核心电商域名)的 HTTPS 为广大买家提供安全的购物体验,这种体量的 HTTPS 服务在业界也极为少见。阿里云在进行电商业务的 HTTPS 改造时,在密码学、SSL/TLS 协议以及 PKI 体系等领域进行了一系列的优化和创新,并在此过程中积累了大量宝贵的经验。

阿里云做为底层基础设施的提供者,在阿里全站 HTTPS 化的过程中提供了大量的技术支撑,阿里云的 CDN 和 SLB 等产品在 HTTPS 的加速以及卸载等环节发挥了重要的作用。因此希望能将在淘宝/天猫业务上积累的 HTTPS 领域的经验和成果,借助阿里云的平台,让更多人来使用,籍此希望跟多的互联网流量能够 HTTPS 化,让流量劫持再无可能。

如何使用HTTPS防止流量劫持的更多相关文章

  1. 【流量劫持】躲避 HSTS 的 HTTPS 劫持

    前言 HSTS 的出现,对 HTTPS 劫持带来莫大的挑战. 不过,HSTS 也不是万能的,它只能解决 SSLStrip 这类劫持方式.但仔细想想,SSLStrip 这种算劫持吗? 劫持 vs 钓鱼 ...

  2. 【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持

    前言 在之前介绍的流量劫持文章里,曾提到一种『HTTPS 向下降级』的方案 -- 将页面中的 HTTPS 超链接全都替换成 HTTP 版本,让用户始终以明文的形式进行通信. 看到这,也许大家都会想到一 ...

  3. 关于全站https必要性http流量劫持、dns劫持等相关技术

    关于全站https必要性http流量劫持.dns劫持等相关技术 微信已经要求微信支付,申请退款功能必须12月7号之前必须使用https证书了(其他目前为建议使用https),IOS也是2017年1月1 ...

  4. 拒绝流量劫持,全面使用 HTTPS!

    最近收到数个 BootCDN 用户的反馈:某些地区的宽带运营商劫持了部分 BootCDN 上的文件,并篡改文件加入了广告代码. 这种方式的流量劫持属于中间人攻击(Man-in-the-Middle A ...

  5. WiFi流量劫持—— JS脚本缓存投毒

    在上一篇<WiFi流量劫持—— 浏览任意页面即可中毒>构思了一个时光机原型,让我们的脚本通过HTTP缓存机制,在未来的某个时刻被执行,因此我们可以实现超大范围的入侵了. 基于此原理,我们用 ...

  6. HTTPS-能否避免流量劫持

    流量劫持是什么? EtherDream在一篇科普文章<>中详细介绍了流量劫持途径和方式. 流量劫持是一种古老的攻击方式,比如早已见惯的广告弹窗等,很多人已经对此麻木,并认为流量劫持不会造成 ...

  7. Linux-某电商网站流量劫持案例分析与思考

    [前言] 自腾讯与京东建立了战略合作关系之后,笔者网上购物就首选京东了.某天在家里访问京东首页的时候突然吃惊地发现浏览器突然跳到了第三方网站再回到京东,心里第一个反应就是中木马了. 竟然有这样的事,一 ...

  8. Web如何应对流量劫持?

    虽然互联网经过多年的发展,可是网站使用的底层协议仍是 HTTP,HTTP 作为一种明文传播协议,所有的传输数据都是明文,我们都知道在通信中使用明文(不加密) 内容可能会被窃听,同时网站存在被劫持的风险 ...

  9. Istio 流量劫持过程

    开篇 Istio 流量劫持的文章其实目前可以在servicemesher社区找到一篇非常详细的文章,可查阅:Istio 中的 Sidecar 注入及透明流量劫持过程详解.特别是博主整理的那张" ...

随机推荐

  1. Best Grass

    Description Bessie is planning her day of munching tender spring grass and is gazing out upon the pa ...

  2. PAT (Advanced Level) 1045. Favorite Color Stripe (30)

    最长公共子序列变形. #include<iostream> #include<cstring> #include<cmath> #include<algori ...

  3. POJ 3905 Perfect Election

    2-SAT 裸题,搞之 #include<cstdio> #include<cstring> #include<cmath> #include<stack&g ...

  4. 写一个程序,统计自己C语言共写了多少行代码,Github基本操作

    前言 在上一篇博客中,本人提到了自己的文件操作可以说是几乎没用过.现在想想,这也算是只在OJ上做题的一个弊端吧.虽然通过OJ做题是一个学习代码好手段,但其他方面也要多多涉猎才好,而不是说OJ用不到文件 ...

  5. 时间轴CSS的Demo

    一.CSS代码(HTML5支持) /*time-line.css*/ .timeline { position: relative; padding: 20px 0 20px; list-style: ...

  6. USACO 1.3.3 Prime Cryptarithm

    题目链接:1.3.3 我用的枚举法,即每产生一组数据就判断是否是所给数字里的. AC还沾沾自喜,但一看题解,发现自己的代码真low... 在平时练习时,应该追求高效,精炼的代码,这样比赛时才能省出大量 ...

  7. Using StructureMap DI and Generic Repository

    In this post, i will show how to use generic repository and dependency injection using structuremap. ...

  8. Struts2--Action属性接收参数

    1. JSP文件调用格式: <a href="user/user!add?name=a&age=8">添加用户</a> 2. struts.xml文 ...

  9. Email:2017

    Hi, 2017,我对自己有一个小小的期望:写写文字,安安心. Enjoy a simple life. 如我所愿吧! 明年再来问候你.

  10. nodejs连接mysql实例

    1.在工程目录下运行npm install mysql安装用于nodejs的mysql模块: 2.创建db.js模块用于连接mysql,同时定义query查询方法: var mysql = requi ...