HTTP

191 阅读16分钟

这是http1.1,写于2013年的日本作者。有几个知识点:

1.历史

1990年,CERN欧洲核子研究组织研发世界上第一台web服务器和web浏览器。同年,http问世。

2.网络基础

TCP/IP协议族:应用层/传输层/网络层/链路层

IP(internet protocol)网际协议位于网络层。作用是把各种数据包传送给对方。

TCP位于传输层,提供可靠的字节流服务。

DNS(Domain Name System)服务是应用层歇息。提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。

URI(Uniform Resource Identifier)是统一资源标识符。URL(Uniform Resource Locator)是统一资源定位符。URI包含URL.

3.简单的HTTP协议

HTTP协议用于客户端和服务的之间的通信。

通过请求和响应的交换达成通信。

HTTP是不保存状态的协议,起初可以更快的处理大量事物且确保协议的可伸缩性,但是有的场景需要网站保存用户的状态就引入了Cookie技术。

告知服务器意图的HTTP方法

  • GET:获取资源

  • POST:传输实体主体

  • PUT:传输文件

  • HEAD:获取报文首部

  • DELETE:删除文件

  • OPTIONS:询问支持的方法

  • TRACE:追踪路径(不常用,已受跨站追踪攻击)

  • CONNECT:要求用隧道协议连接代理

持久连接节省通信量,使得多数请求以管线化方式发送成为可能。

4.HTTP状态码

状态码是当客户端向服务端发送请求时,描述返回的请求结果。如200 OK,由3位数字和原因短语组成。RFC2016的状态码有40种,加上WebDAV,附加HTTP状态码有60种。实际常用的14种。

2XX 成功

200 OK

204 No Content

206 Partial Content

3XX 重定向

301 Moved Permanently

302 Found

303 See Other

304 Not Modified

307 Temporary Redirect

4XX 客户端错误

400 Bad Request

401 Unauthorized

403 Forbidden

404 Not Found

5XX 服务端错误

500 Internal Server Error

503 Service Unavailable

5.HTTP首部

HTTP报文由报文首部/空行(CR+LF)/报文主体构成。

请求报文的报文首部:请求行(方法,URI,HTTP版本),HTTP首部字段构成。

响应报文的报文首部:相应行(HTTP版本,状态码),HTTP首部字段构成。

状态码【数字和原因短语】

首部字段【首部字段名:字段值】

四种HTTP首部字段的类型:

  • 通用首部字段 General Header Fields

    • Cache-Control 能操作缓存的工作机制(请求指令和响应指令)
    • Connection 控制代理不再转发和管理持久连接
    • Date 创建HTTP报文的日期和时间
    • Pragma 历史遗留字段,作为http向后兼容。
    • Trailer 在报文主体后记录了哪些首部字段,可应用在HTTP/1.1版本分块传输编码时。
    • Transfer-Encoding 传输编码方式仅对分块传输编码有效。
    • Upgrade (前提Connection:Upgrade) 更高版本通信
    • Via 追踪客户端和服务器之间的请求和响应报文的传输路径
    • Warning 告知用户与缓存相关问题的警告
  • 请求首部字段 Request Header Fields

    定义:从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息/客户端信息/对响应内容相关的优先级等内容

    • Accpet 通知服务器,用户代理能够处理的媒体类型和媒体类型的相对优先级。q指qvalue,指权重值。
    • Accept-Charset 通知服务器用户代理支持的字符集及字符集的相对优先顺序。
    • Accept-Encoding 告知服务器用户代理支持的内容编辑及内容编码的优先级顺序。
    • Accept-Language 告知服务器用户代理能够处理的自然语言集以及自然语言集的相对优先级。
    • Authorization 告知服务器,用户代理的认证信息(证书值)。
    • Expect 告知服务器,期望出现的某种特定行为。
    • Form 告知服务器是用户代理的电子邮件地址。
    • Host 告知服务器,请求的资源所处的互联网主机名和端口号。

    • If-Mathch 条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
    • If-Modified-Since 确认代理或客户端拥有的本地资源的有效性。

    • If-None-Match 指定字段值的实体标记(ETag)值与请求资源的ETag不一致时,告知服务器处理该请求。
    • If-Range 指定字段值(ETag值或者时间)和请求资源ETag值或时间相一致,则作为范围请求处理。反之,返回全体资源。
    • If-Unmodified-Since 告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。
    • Max-Forwards 使用HTTP协议通信时,请求可能会经过代理等多台服务器,当Max-Forwards字段值为0时,服务器立即返回响应。
    • Proxy-Authorization 接收代理服务器发送的认证质询,客户端会发送包含首部字段Proxy-Authorization请求,以告知服务器认证所需要的信息。
    • Range 获取部分资源的范围请求,告知服务器资源的指定范围。
    • Referer(referrer) 告知服务器请求的原始资源的URI.
    • TE 告知服务器客户端能够处理响应的传输编码方式及相对优先级。还可以指定伴随trailer字段的分块传输编码方式(TE:trailers)。
    • User-Agent 创建请求的浏览器和用户代理名称等信息传达给服务器。
  • 响应首部字段 Response Header Fields

    由服务器向客户端返回响应报文所使用的字段,用于补充响应的附加信息/服务器信息以及客户端的附加要求等信息

    • Accept-Ranges 告知客户端,服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
    • Age 告知客户端,源服务器在多久前创建了响应。若创建该响应的服务器是缓存服务器,Age是指缓存后的响应再次发起认证到认证完成的时间值。
    • ETag 告知客户端实体标识。
    • Location 强制性地尝试对已提示的重定向资源的访问。
    • Proxy-Authenticate 代理服务器所要求的认证信息发送给客户端。
    • Retry-After 告知客户端应该在多久之后再次发送请求。
    • Server 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
    • Vary 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。
    • WWW-Authenticate 用于HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。
  • 实体首部字段 Entity Header Fields

    • Allow 通知客户端能够支持Request-URI指定资源的所有HTTP方法。
    • Content-Encoding 告知客户端,服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下进行的压缩。
    • Content-Language 告知客户端,实体主体使用的自然语言。
    • Content-Length 表明实体主体部分的大小(单位是字节)
    • Content-Location 给出与报文主体部分相对应的URI。
    • Content-MD5 一串有MD5算法生成的值。

    • Content-Range 针对范围请求,响应时的Content-Range能告知客户端作为响应返回的实体哪个部分符合范围请求。
    • Content-Type 说明主体内对象的媒体类型。
    • Expires 将资源失效的日期告知客户端。不希望缓存服务器缓存时可以将Expires字段写入与Date字段相同的时间值。Cache-Control指定的max-age指令优先max-age指令。
    • Last-Modified 指明资源最终修改的时间。
  • Cookie服务的首部字段

    Cookie的工作机制是用户识别及状态管理。调用Cookie时,由于可校验Cookie的有效期,以及发送方的域/路径/协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点和攻击者的攻击而泄漏。

    Cookie在1994年正式应用在网景浏览器中,且目前使用最广泛的Cookie标准不是RFC中定义的任何一个,而是在网景公司制定的标准上进行扩展后的产物

    • Set-Cookie 开始状态管理所使用的Cookie信息,响应首部字段

    字段值包括 NAME=VALUE expires=DATE path=PATH domain=域名 Secure HttpOnly

    • Cookie 服务器接收到的Cookie信息,请求首部字段

    Cookie:status=enable

  • 其他首部字段

    • X-Frame-Options

    属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。主要目的是防止点击劫持攻击。能够在web服务器端预先设定好X-Frame-Options字段值是最理想的状态。

    <IfModule mod_headers.c>
        Header append X-FRAME-OPTIONS "SAMEORGIN"
    </IfModule>
    
    • X-XSS-Protection

    属于HTTP响应首部,针对跨站脚本攻击的一种对策,用于控制浏览器XSS防护机制的开关。

    • DNT(Do Not Track)

    属于HTTP请求首部,拒绝个人信息被手机,是表示拒绝被精准广告追踪的一种方法。

    • P3P(The Platform for Privacy Preferences)

    属于HTTP响应首部,可以让web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

    注意:协议中对非标准参数的前缀X-废除。

还有,非正式的首部字段 RFC4229 HTTP Header Fields Registrations

还有,End-to-end Header(端到端首部)和Hop-by-hop Header(逐跳首部)

6.确保web安全的HTTPS

<1>.HTTP的缺点及解决办法探究

  • (1)通信使用明文可能会被窃听

    TCP/IP是可能被窃听的网络。只需要收集互联网上流动的数据包(帧)就行了。对于收集来的数据包的解析工作,可交给抓包(Packet Capture)或嗅探器(Sniffer)工具。

    抓包工具Wireshark可以获取HTTP协议的请求和响应的内容,并对其进行解析。

    解决办法:加密处理防止被窃听

    通信的加密。通过和SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。与SSL组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)。

    内容的加密。

  • (2)不验证通信方的身份就可能遭遇伪装

    任何人都可以发起请求,而且服务器只接收请求不管对方是谁都会返回一个响应。所以存在各种隐患。

    解决办法:查明对手的证书。证书是由社会认可的第三方机构颁发,用以证明服务器和客户端是实际存在的。

  • (3)无法证明报文完整性,可能已遭篡改

    所谓完整性是指信息的准确度。在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。

    解决方法:HTTP协议已有的方法,包括MD5,SHA-1等散列值校验方法以及确认文件的数字签名方法。但是需要用户本人亲自检查下载的文件是否就是原来服务器上的文件,而且PGP/MD5本身也可能被篡改。所以仅靠HTTP确保完整性是困难的,可以通过和其他协议组合使用来实现这个目标。

<2>.HTTP+加密+认证+完整性保护=HTTPS

SSL是当今世界上应用最为广泛的网络安全技术。HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信。(SSL是属于哪个层的协议?)

SSL的密钥,公开密钥加密的加密处理方式。

共享密钥加密(对称密钥加密),即加密和解密同用一个密钥的方式。

公开密钥加密(非对称密钥加密),即私有密钥不能让其他人知道,而公开密钥可以随意发布任何人都可以获得。

HTTPS采用混合加密机制。

  • 证明公开密钥正确性的证书

    公开密钥的加密方式无法证明公开密钥本身就是货真价实的公开密钥。为了解决这个问题,可以使用有数字认证机构(CA,Certificate Authority)和相关机关办法的公开密钥证书。

    • 可证明组织真实性的EV SSL证书
    • 用以确认客户端的客户端证书
    • 认证机构信誉第一
    • 由自认证机构颁发的证书称为自签名证书
    • 中级认证机构的证书可能会变成自认证证书
  • HTTPS的安全通信机制

    HTTPS比HTTP慢2到100倍

    SSL的慢分为两种。一种是指通信慢,一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。可以使用SSL加速器(专用服务器)硬件来改善该问题。

    为什么不一直使用HTTPS?

    加密通信会消耗更多的CPU及内存资源。非敏感信息使用HTTP通信,包含个人信息等敏感数据时才利用HTTPS加密通信。

    要节约购买证书的开销也是原因之一。该买证书并不合算的服务以及一些个人网站可能会选择HTTP的通信方式。

    7.确认访问用户身份的认证

    作用:某些web网站只想让特定的人浏览,或者干脆仅本人可见。所以需要使用认证功能。

    何为认证:弄清谁在访问服务器,就得让对方客户端自报家门,并且可以核对信息是否属实(核对的信息通常是密码,动态令牌,数字证书,生物认证,IC卡等)。

    HTTP使用的认证方式:BASIC认证,DIGEST认证,SSL客户端认证,FormBase认证,Windows统一认证

    SSL客户端认证:借由HTTPS的客户端证书完成认证。不会仅依靠证书完成,一般会和基于表单认证组合形成一种双因素认证。第一个认证因素用来认证客户端计算机,另一个认证因素确定这是用户本人的行为。但是需要一定费用,即从认证机构购买客户端证书的费用,以及服务器运营者为保证自己搭建的认证机构安全运营所产生的费用。

    基于表单的认证:不是在HTTP协议中定义的。客户端会向服务器上的web应用程序发送登录信息,按登录信息的验证结果认证。因为对于web网站的认证能够满足安全级别的标准规范并不存在,所以认证多半为基于表单的认证,而且一般会使用cookie来管理session。一种安全的保存方法是先利用给密码加盐的方式增加额外信息,再使用散列函数计算出散列值后保存。

8.基于HTTP的功能追加协议

HTTP的功能在使用时捉襟见肘,(1)防火墙的基本功能是禁止非指定的协议和端口号的数据包通过。如果使用新协议或端口号则必须修改防火墙的设置。(2)互联网上使用率最高的当属web,而web是基于HTTP协议运作的,因此在构建web服务器或web站点时需要事前设置防火墙HTTP(80/tcp)和HTTPS(443/tcp)的权限。(3)作为HTTP客户端的浏览器已相当普遍,HTTP服务器数量已颇具规模。

HTTP通信的问题:

解决问题:AJAX / Comet 可以实现局部更新;

SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。基本上只是将单个域名(IP地址)的通信多路复用,所以当一个web网站使用多个域名下的资源改善效果就会受到限制,但其的确是一种可消除HTTP瓶颈的技术。

WebSocket使用浏览器进行双工通信。WebSocket协议有IETF定为标准,WebSocket API由W3C定为标准。WebSocket技术主要是为了解决Ajax和Comet里XMLHttpRequest附带的缺陷所引起的问题。

  • HTTP 2.0
  • WebDAV web服务器的分布式文件管理系统

9.构建web内容的技术和web的攻击技术

<1> HTML 和 动态HTML

1993年,在伊利诺伊大学NCSA发布了Mosaic浏览器,而能够被Mosaic解析的HTML,统一标准后即作为HTML1.0发布。1999年,WEC推荐使用HTML4.01。2014年,推荐HTML5标准。

动态HTML,是使用客户端脚本语言将静态的HTML内容变成动态的技术的总称。DOM是用以操作HTML和XML文档的API。

<2> Web应用 和 数据发布的格式及语言

web应用是指通过web功能提供的应用程序。web应用作用于动态内容之上。

CGI(Common Gateway Interface,通用网关接口)是指web服务器在接收到客户端发送过来的请求后转发给程序的一组机制。 Servlet是一种能在服务器上创建动态内容的程序,是用java语言实现的一个接口,属于面向企业及java的一部分。

XML(eXtensible Markup Language)可扩展标记语言是一种可按应用目标进行扩展的通用标记语言。

JSON(JavaScript Object Notation)是一种以JavaScript的对象表示法为基础的轻量级数据标记语言。能够处理的数据类型有false/true/null/object/array/number/string 7种。

<3> web的攻击技术

应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用等资源是攻击目标。

针对Web应用的攻击主要有:HTTP不具备必要的安全功能,开发者需要自行设计并开发认证及绘画管理功能满足Web应用的安全。在HTTP请求报文内加载攻击代码就能发起对Web应用的攻击。

针对web应用的攻击模式有:主动攻击(以服务器为目标的主动攻击,SQL注入攻击和OS命令注入攻击),被动攻击(以服务器为目标的被动攻击,跨站脚本攻击和跨站点请求伪造),被动攻击(利用用户的身份攻击企业内部网络)

  • 因传输值转义不完整引发的安全漏洞

  • 因设置或设计上的缺陷引发的安全漏洞

  • 因会话管理疏忽引发的安全漏洞

  • 其他安全漏洞

深入了解HTTP/2 developer.mozilla.org/zh-CN/docs/…