HTTP 学习

名词:

HTTP HyperText Transfer Protocol 超文本传输协议

HTML HyperText Markup Language  超文本标记语言
 
FTP File Transfer Protocol 文件传输协议

DNS Domain Name System 域名系统

TCP Transmission Control Protocol 传输控制协议

UDP User Data Protocol 用户数据报协议

HTTP 每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销.

为了解决 TCP 连接的问题/1.1 和一部分的 HTTP/1.0 相处了持久连接,也称为 HTTP keep-alive 或 HTTP connection reuse。 持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP 连接状态。

其减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务端的负载。另外,减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样Web 页面的显示速度也就相应提高了。

客户端在第一次请求时服务器生成 Cookie,记住是谁发送的,然后在响应后添加Cookie后返回。第二次客户端就会在请求中添加Cookie,服务器检查Cookie后就相当于记住了客户端。

通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体发生差异。

常用的内容编码:

gzip (GNU zip)

compress (UNIX 系统的标准压缩)

deflate (zlib)

identify (不进行编码)

将实体主体分块的功能称为分块传输编码 (Chunked Transfer Coding)

分割物称为快 (chunk)

MIME(Multipurpose Internet Mail Extensions) 多用途因特网邮件扩展

  • 状态码
    • 1XX 信息性状态码 接收的请求正在处理
    • 2XX 成功状态码 请求正常处理完毕
    • 3XX 重定向状态码 需要进行附加操作以完成请求
    • 4XX 客户端错误状态码 服务器无法处理请求
    • 5XX 服务器错误状态码 服务器处理请求出错

204 No Content 请求处理成功,但没有资源可返回

206 Partial Content 客户端进行了范围请求

301 Moved Permanently 请求的资源已被分配了新的 URI,以后应使用资源现在所指的URI。 永久移动

302 Found 临时性重定向 表示请求的资源已被分配了新的 URI,希望用户本次能使用新的 URI访问。 暂时性移动。

303 See Other 由于请求对应的资源存在着另一个 URI, 应使用 GET 方法获取请求的资源。

当301,302、303 响应状态码返回时,

几乎所有的浏览去都会把 POST改为 GET,

并删除请求报文内的主体,之后请求会自动再次发送。    

301、302 标准是禁止将 POST 方法改成 GET 方法的,

但实际使用时大家都会这么做。

304 Not Modified表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。 不包含任何响应的主体部分。 附带的请求是指采用 GET 方法的请求报文中含 If-Match,If-Modified-Since,If-None-Match,If-Range, If-Unmodified-Since 中任一首部。

307 Temporary Redirect 临时重定向,与302 相同含义,。但是其会遵照浏览器标准,不会从POST 变为 GET。

400 Bad Request 表示请求报文中存在语法错误。浏览器会像 200 OK一样对待该状态码。

401 Unauthorized 表示需要认证

403 Forbidden 请求资源的访问被拒绝了。

404 Not Found 服务器上无法找到请求的资源,也可以在服务器端拒绝请求且不想说明理由时使用。

500 Internal Server Error 服务器端在执行请求时发生了错误。也有可能时 Web 应用存在的 bug 或某些临时的故障。

503 Service Unavailable 服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。如果事先得知解除状况需要的时间,最好写入 Retry-After 首部字段在返回给客户端。

注意: 状态码和状况不一致。不少返回的状态码响应都是错误的。

允许一台HTTP 服务器搭建多个 Web 站点,这是利用了虚拟主机 (Virtual Host) 的功能。

HTTP 通信时,除了客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。

  • 代理

    是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。

    缓存代理和透明代理。 缓存代理会预先将资源的副本保存在代理服务器上。 透明代理是不对报文做任何加工,所以有非透明代理,即对报文内容进行加工。

    • 优点

      • 利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
  • 网关

    网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它像自己拥有资源的源服务器一样进行处理。有时客户端可能都不会察觉自己的通信目标是一个网关。

    网关能使通信线路上的服务器提供非 HTTP 协议服务。另外能提高通信的安全性,可以在客户端与网关之间的通信线路上加密以确保连接的安全。

  • 隧道
    按要求建立起一条与其他服务器的通信线路,可以使用 SSL 等加密手段进行通信。其主要目的使确保客户端能与服务器进行安全的通信。

    隧道本省不会去解析 HTTP 请求。其本身使透明的。

缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用它可以减少对源服务器的访问,节省了通信流量和通信时间。它有一个缓存的有效期限。

http/1.1 通用首部字段

通用首部字段是指,请求报文和响应报文双方都会用到的首部

  • Cache-Control

通过指定这个字段可以操作缓存的工作机制。 no-cache:代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。 no-store 才是真正地不进行缓存。 s-maxage 指令的功能与 max-age 指令相同。不同点是 s-maxage 指令只适用于多位用户使用的公共缓存服务器。

  • Connection

    控制不在转发给代理的首部字段

    管理持久连接

  • Trailer

    • 它会事先说明报文主体后记录了哪些首部字段
  • Via

    • 为了追踪客户端与服务器之间的请求和响应报文的传输路径
  • Warning

    • 通常会告知用户一些与缓存相关的问题的警告

请求首部字段

它是从客户端服务端发送请求报文中所用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。

  • Accept
    • 通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级,可使用 q= 来额外表示优先级
  • Accept-Charset
    • 通知服务器用户代理支持的字符集及字符集的相对优先顺序
  • Accept-Encoding
    • 通知服务器用户代理支持的内容编码以及内容编码的优先级顺序
  • Accept-Language
    • 通知服务器用户代理能够处理的自然语言集
  • Authorization
    • 通知服务器用户代理的认证信息
  • From
    • 通知服务器使用用户代理的用户的电子邮件地址
  • Host
    • 会告知服务器请求的资源所处的互联网主机名和端口号 必须被包含
  • If-Match
    • 条件请求。 告知服务器匹配资源所用的实体标记值。
  • If-Range
    • 告知服务器若指定的 If-Range 字段值和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
  • If-Unmodified-Since
    • 告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。 否则以 412 返回
  • Max-Forwards
    • 每次转发数值减 1. 当数值为 0 时返回响应。
  • proxy-authorization
    • 接收到从代理服务器发来的认证质询时,客户端会发送包含此字段的请求,以告知服务器认证所需要的信息。
  • Range
    • 指定范围信息
  • Referer
    • 告知服务器请求的原始资源的 URI。 正确的拼写应该是 Referrer,不知为何,大家一直沿用这个错误的拼写。
  • TE
    • 告知服务器客户端能够处理响应的传输编码及相对优先级。还能指定伴随 trailer 字段的分块传输编码的方式。
  • User-Agent
    • 将创建请求的浏览器和用户代理名称等信息传送给服务器

响应首部字段

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

  • Accept-Ranges
    • 告知客戶端服务器是否能处理范围请求,以指定获取服务器某个部分的资源
  • Age
    • 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
  • ETag
    • 告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag 值。有强弱之分。
  • Location
    • 可以将响应接收方引导至某个与请求 URI 位置不同的资源。基本上,该字段会配合 3xx:Redirection 的响应,提供重定向的URI。
    • 几乎所有的浏览器在接收到此值后,会尝试对此的访问。
  • Proxy-Authenticate
    • 会把代理服务器所要求的认证信息发送给客户端。
  • Retry-After
    • 会告知客户端应该在多久后再次发送请求。
  • Server
    • 告知客户端当前服务器上安装的 HTTP服务器应用程序的信息。
  • Vary
    • 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。
  • Www-Authenicate
    • 用于 HTTP 访问认证。

实体首部字段

包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。

  • Allow
    • 通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。收到不支持的方法时,会以 405 Method Not Allowed 作为响应返回。
  • Content-Encoding
    • 告知客户端服务器对实体的主体部分选用的编码方式。
  • Content-Language
    • 告知客户端服务器对实体的主体部分选用的自然语言。
  • Content-Length
    • 表明了实体主体部分的大小。
  • Content-Location
    • 表示的是报文主体返回资源对应的 URI。
  • Content-MD5
    • 客户端会对接受的报文主体执行相同的MD5 算法,然后与此字段比较。无法检测出恶意篡改。
  • Content-Range
    • 告知客户端作为响应返回的实体的那个部分符合范围请求。
  • Content-type
    • 说明了实体主体内对象的媒体类型。
  • Expires
    • 会见资源失效的日期告知客户端。
  • Last-Modified
    • 指明资源最终修改的时间。

为 Cookie 服务的首部字段

  • Set-Cookie
    • 开始状态管理所使用的 Cookie 信息
    • 响应首部字段
    • 有 name、expires、path、domain、Secure、HttpOnly 属性。
    • HttpOnly 是JavaScript 脚本无法获得 Cookie。主要是为了防止跨站脚本攻击。改扩展并非是为了防止 XSS 而开发的。
  • Cookie
    • 服务器接收到的 Cookie 信息
    • 请求首部字段

其他首部字段

HTTP首部字段可以总醒扩展,出现了一些X开头的扩展,有
X-Frame-Options、X-XSS-Protection
还有 DNT(拒绝个人信息被收集),P3P(保护用户隐私) 扩展。
X扩展现在不被支持。

确保安全的 HTTPS

  • http 缺点
    • 通信使用明文(不加密),内容有可能被窃听
    • 不验证通信方的身份,有可能遭遇伪装
    • 无法证明报文的完整性,有可能被篡改

解决办法:

  • 将通信加密。 通过和 SSL(Secure Socket Layer, 安全套接层) 或 TLS(Transport Layer Security, 安全层传输协议) 的组合使用。
  • 内容的加密。 对报文加密处理后再发送请求。但还是会有被篡改的风险。

任何人都可以发起请求,服务器不确认通信方。

PGP (Pretty Good Privacy, 完美隐私)

SSL 提供认证和加密处理及摘要功能。

HTTPS = HTTP + 加密 + 认证 + 完整性保护

SSL 是独立于 HTTP 的协议,其他运行再应用层的 SMTP和 Telnet 等协议均可配合 SSL 协议使用。

SSL 采用公开密钥加密的加密处理方式。使用一对非对称的密钥,私钥和公钥。

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

可证明组织真实性的EV SSL 证书,它是基于国际标准的认证指导方针颁发的证书。持有这个证书的 Web 网站的浏览器地址栏处的背景色是不同的,它是为了防止用户被钓鱼攻击。但是就效果上来说,还不明显,仍有一部分用户不了解。

SSL 较慢。一是通信慢,网络负载可能会变慢。另一点是 SS L必须进行加密处理。其比起 HTTP 会更多地消耗服务器和客户端的硬件资源,导致负载增强。

为什么不一直使用 HTTPS?

与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。
如果是会敏感信息则使用 HTTP 通信,
只有在包含个人信息等敏感数据时,才利用 HTTPS 加密通信。
另外,购买证书的开销也是原因之一。
因为进行 HTTPS 通信时,证书是必不可少的,而证书必须购买。

CBC 模式(Cipher Block Chaining) 又名密码分组链接模式。在此模式下,将前一个明文块加密处理后和下一个明文块做 XOR 运算,使之重叠,然后再对运算结果做加密处理。对第一个明文块做加密时,要么使用前一段密文的最后一块,要么利用外部生成的初始向量(initial vector, IV)。

TSL 是以 SSL 为原型开发的协议,有时会统一称该协议为 SSL。

确认访问用户身份的认证

认证通常有一下几种方式:

  • 密码:本人知道的字符串
  • 动态令牌:本人持有的设备内显示的一次性密码
  • 数字证书:本人(终端)持有的信息
  • 生物认证:指纹和虹膜等本人的生理信息。
  • IC卡等: 仅限本人持有的信息。

HTTP 使用的认证方式:

  • BASIC 认证(基本认证)
    • 服务器返回 401 告知客户端需要认证
    • 浏览器弹出认证框
    • 一般浏览器无法实现认证注销,不够便捷灵活,明文传送消息
  • DIGEST 认证(摘要认证)
    • 质询/响应方式 不会像 BASIC 认证那样直接发送明文密码
    • 会有质询码
    • 不存在防止用户伪装的保护
  • SSL 客户端认证
    • 借由 HTTPS 的客户端完成证书的方式
  • FormBase 认证(基于表单认证)
    • 客户端会向服务器上的 Web 应用程序发送登录信息,按登录信息的验证结果认证,认证多半为基于表单认证

Session 管理及 Cookie 应用
客户端发送已登录信息,服务器向用户发放 Session ID,记录认证状态

客户端以后再次请求时,会发送包含 Session ID 的 Cookie,服务器通过验证 Session ID 来判断对方是真实用户

为减轻跨站脚本攻击 XSS 造成的损失,建议事先在 Cookie 内加上 httponly 属性。

一种安全的保存方式是,先利用给密码加盐的方式增加额外信息,在使用散列(hash)函数计算出散列值后保存。

加盐就是有服务器随机生成的一个字符串,但是要保证长度足够长,并且是真正随机生成的。然后把它和密码字符串相连接生成散列值。当两个用户使用同一个密码时,由于随机生成的 salt 值不同,对应的散列值也将是不同的。这样一来,很大程度上减少了密码特征。

Ajax 的解决办法
Ajax (Asynchronous JavaScript and XML, 异步 JavaScript 与 XML 技术)是一种有效利用 JavaScript 和 DOM 的操作,以达到局部 Web 页面替换加载的异步通信手段。 Ajax 的核心技术是名为 XMLHttpRequest 的 API,通过 Jvascript 脚本语言的调用就能和服务器进行 HTTP 通信。但是其并未解决 HTTP 协议本身存在的问题。

Conmet 这是一种通过延迟应答,模拟事先服务器向客户端推送的功能。

WebSocket, 即 Web浏览器与 Web 服务器之间全双工通信标准。主要是为了解决 Ajax 和 Conmet 里 XMLHttpRequest 附带的缺陷所引起的问题。

WebSocket 的主要特点:

  • 推送功能
  • 减少通信量
  • 握手请求

CGI(Common Gateway Interface,通用网关接口)是指 Web 服务器在接收到客户端发送过来的请求后转发给程序的一组机制。

Servlet 是一种能在服务器上创建动态内容的程序。Servlet 的运行环境叫做 Web 容器或 Servlet 容器。其常驻内存,在每次请求时,可启动相对进程级别更为轻量的 Servlet, 程序的执行效率从而变得更高。

XML(eXtensible Markup Language,可扩展标记语言)是一种可按应用目标进行扩展的通用标记语言,只在通过使用它使互联网数据共享变得更容易。与 HTML 相比,它对数据记录的方式做了特殊处理。

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

Web 的攻击技术

再次强调 HTTP 是不安全的,对 Web 应用的攻击模式有

  • 主动攻击
    • 指攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式。
    • 具有代表性的是 SQL 注入攻击和 OS 命令注入攻击。
  • 被动攻击
    • 指利用圈套策略执行攻击代码的攻击模式。

跨站脚本攻击 (Cross-Site Scripting, XSS) 是指通过存在安全漏洞的 Web网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。

可能造成的影响:

  • 利用虚假输入表单来骗取用户个人信息
  • 利用脚本窃取用户的 Cookie 值,攻击者发送恶意请求
  • 显示伪造的文章或图片

SQL 注入攻击
指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击。

OS 命令注入攻击
指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。只要在能调用 Shell 函数的地方就有存在被攻击的风险。

HTTP 首部注入攻击
指攻击者通过在响应首部内插入换行,添加任意响应首部或主体的一种攻击。被动攻击。
危害:

  • 设置任何 Cookie 信息
  • 重定向至任意 URL
  • 显示任意的主体

开放重定向
一种对指定的任意 URL 作重定向跳转的功能。又可能被攻击者选中并用来作为钓鱼攻击的跳板。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容