我们已经了解到HTTP协议具有相当优秀和方便的一面,然而HTTP并非只有好的一面,事物皆具有两面性,它也是有不足之处的,那么HTTP有哪些缺点呢?
窃听风险
由于HTTP本身不具备加密的功能,所以也无法做到对通信内容进行加密,即HTTP报文是使用明文方式发送的。
如果要问为什么通信时不加密是一个缺点,这是因为,HTTP的底层是基于TCP/IP协议,而按TCP/IP协议簇的工作机制,通信内容在所有通信线路上都有可能造到窃听。
所谓互联网,是由能连通到全世界的网络组成的。无论世界哪个角落的服务器在和客户端通信时,在此通信线路上的某些网络设备,光缆,计算机等都不可能是个人的私有物,所以不排除某个环节中会遭到恶意窃听的行为。
即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会被看到的。如下图:
窃听相同段上的通信并非难事。只需要收集在互联网上流动的数据包就行了。对于收集来的数据包的解析工作,可交给那些抓包工具。下面的图片示例就是被广泛使用的抓包工具Wireshark,它可以获取HTTP的请求和响应的内容,并对其进行解析。像使用GET方法发送请求,响应返回了200 OK,查看HTTP响应报文的全部内容等一系列的事情都可以做到。如下图:
篡改风险
由于HTTP协议无法证明通信报文的完整性,因此,在请求或响应送出之后直到对方接到之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。
换句话说,没有任何办法确认,发出的请求或响应和接收到的请求或响应是前后相同的。如下图:
比如,从某个Web网站上下载内容,是无法确定客户端下载的文件和服务器上存放的文件是否前后一致,文件内容在传输途中可能已经被篡改为其它的内容,即使内容真的已改变,作为接收方的客户端也是觉察不到的。像这样,请求或响应在传输中,遭到攻击者拦截并篡改内容的攻击称为中间人攻击。如下图:
冒充风险
在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求,另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的IP地址和端口号没有被Web服务器设定限制访问的前提下)。如下图:
HTTP协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在以下安全隐患:
- 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器,有可能是已伪装的Web服务器。
- 无法确定响应返回到客户端是否按真实意图接收响应的那个客户端,有可能是已伪装的客户端。
- 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。
- 无法判定请求来自何方,出自谁手。
- 即使是无意义的请求也会照单全收,无法阻止海量请求下的DoS攻击。
安全通信的四个原则
一般我们认为安全的通信必须包括以下四个原则:
- 机密性。对数据进行加密,解决窃听风险,因为即使被中间人窃听,由于数据是加密的,他也拿不到明文。
- 完整性。数据在传输过程中没有被篡改,不多不少,保持原样,中途如果哪怕改了一个标点符号,接收文也能识别出来,从而判定接收报文不合法。
- 身份认证。确认对方的真实身份,即证明【你是妈】的问题,解决了冒充风险,用户不用担心访问的是某宝结果却在和钓鱼网站通信的问题。
- 不可否认。即不可否认已经发生的行为,比如小明向小红借了100元,但没打借条,或者打了借条但没有签名,就会造成小红的资金损失。
那么因为HTTP协议有窃听风险,篡改风险和冒充风险,同时网络安全通信有四个原则,所以是时候请出HTTPS了。
针对SSL免费证书的不足和痛点,我开发并开源了一个平台:华迅FreeCert平台,支持免费的SSL证书,通配符证书的申请和托管,配合自动部署工具可以实现证书的自动化更新和部署,真正做到一次申请终身自动更新和自动部署,感兴趣的同学可以试一下!