《图解HTTP》书摘

图解HTTP

上野宣、于均良
1.3 网络基础 TCP/IP
2016-03-03
相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而
2016-03-03
协议中存在各式各样的内容。从电缆的规格到 IP 地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及 Web 页面显示需要处理的步骤,等等。
2016-03-03
值得一提的是,层次化之后,设计也变得相对简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方、对方的传输路线是怎样的、是否能确保传输送达等问题。
2016-03-03
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
2016-03-03
这种把数据信息包装起来的做法称为封装(encapsulate)。
1.4 与 HTTP 关系密切的协议 : IP、TCP 和 DNS
2016-03-03
IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC 地址(Media Access Control Address)。
2016-03-03
IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换,但 MAC 地址基本上不会更改。
2016-03-03
会利用下一站中转设备的 MAC 地址来搜索下一个中转目标。这时,会采用 ARP 协议(Address Resolution Protocol)。ARP 是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
2016-03-03
我们是想通过这个比喻说明,无论哪台计算机、哪台网络设备,它们都无法全面掌握互联网中的细节。
2016-03-03
所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。
2016-03-03
用 TCP 协议把数据包送出去后,TCP 不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和 ACK(acknowledgement)。
2016-03-03
发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。
1.5 负责域名解析的 DNS 服务
2016-03-03
它提供域名到 IP 地址之间的解析服务。
2016-03-03
为了解决上述的问题,DNS 服务应运而生。DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
1.7 URI 和 URL
2016-03-03
资源的定义是“可标识的任何东西”。除了文档文件、图像或服务(例如当天的天气预报)等能够区别于其他类型的,全都可作为资源。另外,资源不仅可以是单一的,也可以是多数的集合体。
2016-03-03
URI 用字符串标识某一互联网资源,而 URL 表示资源的地点(互联网上所处的位置)。可见 URL 是 URI 的子集。
2016-03-03
表示指定的 URI,要使用涵盖全部必要信息的绝对 URI、绝对 URL 以及相对 URL。
2016-03-03

让我们先来了解一下绝对 URI 的格式。
2016-03-03
使用绝对 URI 必须指定待访问的服务器地址。地址可以是类似 hackr.jp 这种 DNS 可解析的名称,或是 192.168.1.1 这类 IPv4 地址 名,还可以是 [0:0:0:0:0:0:0:1] 这样用方括号括起来的 IPv6 地址名。
2016-03-03
针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。
2.2 通过请求和响应的交换达成通信
2016-03-03
HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
2016-03-03
请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
2016-03-03
响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成
2.3 HTTP 是不保存状态的协议
2016-03-03
协议对于发送过的请求或响应都不做持久化处理
2016-03-03
使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
2.4 请求 URI 定位资源
2016-03-03
如果不是访问特定资源而是对服务器本身发起请求,可以用一个 * 来代替请求 URI
2.5 告知服务器意图的 HTTP 方法
2016-03-03
GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像 CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。
2016-03-03
虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST 方法。虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容。
2016-03-03
PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。
2016-03-03
但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用 REST(REpresentational State Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。
2016-03-03
图:和 GET 一样,但不返回报文主体
2016-03-03
但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的
2016-03-03
但是,TRACE 方法本来就不怎么常用,再加上它容易引发 XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。
2.7 持久连接节省通信量
2016-03-03
使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。
2016-03-03
想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
2016-03-03
在 HTTP/1.1 中,所有的连接默认都是持久连接
2016-03-03
管线化技术出现后,不用等待响应亦可直接发送下一个请求。
2.8 使用 Cookie 的状态管理
2016-03-03
假设要求登录认证的 Web 页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。
3.3 编码提升传输速率
2016-03-03
HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的 CPU 等资源。
2016-03-03
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
3.4 发送多种数据的多部分对象集合
2016-03-03
HTTP 协议中也采纳了多部分对象集合,发送的一份报文主体内可含
4.2 2XX 成功
2016-03-03
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。比如,使用 GET 方法时,对应请求资源的实体会作为响应返回;而使用 HEAD 方法时,对应请求资源的实体首部不随报文主体作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)
4.3 3XX 重定向
2016-03-03
表明浏览器需要执行某些特殊的处理以正确处理请求。
2016-03-03
临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
2016-03-03
但 302 状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。
2016-03-03
303 状态码明确表示客户端应当采用 GET 方法获取
2016-03-03
当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。
2016-03-03
条件的请求 2 时,服务器端允许请求访问资源,但未满足条件的情况。3
4.4 4XX 客户端错误
2016-03-03
4XX 的响应结果表明客户端是发生错误的原因所在。
2016-03-03
当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。
2016-03-03
返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。
2016-03-03
未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因
2016-03-03
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
4.5 5XX 服务器错误
2016-03-03
状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端。
2016-03-03
不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种情况也经常遇到。
5.1 用单台虚拟主机实现多个域名
2016-03-03
HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。
2016-03-03
这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。
2016-03-03
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。
5.2 通信数据转发程序 :代理、网关、隧道
2016-03-04
还有一些用于通信数据转发的应用程序
2016-03-04
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
2016-03-04
代理是一种有转发功能的应用程序
2016-03-04
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
2016-03-04
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
跟代理什么区别
2016-03-04
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。
2016-03-04
每次通过代理服务器转发请求或响应时,会追加写入 Via 首部信息
2016-03-04
透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
2016-03-04
利用网关可以由 HTTP 请求转化为其他协议通信
2016-03-04

网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非 HTTP 协议服务。
2016-03-04
利用网关能提高通信的安全性,因
???
2016-03-04
届时使用 SSL 等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
2016-03-04
隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
2016-03-04
隧道本身是透明的,客户端不用在意隧道的存在
5.3 保存资源的缓存
2016-03-04
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
2016-03-04
即便缓存服务器内有缓存,也不能保证每次都会返回对同资源的请求。因为这关系到被缓存资源的有效性问题。
2016-03-04
外,和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资
2016-03-04
在 HTTP 普及之前,也就是从互联网的诞生期至今,曾出现过各式各样的协议。在 HTTP 规范确立之际,制定者们参考了那些协议的功
2016-03-04
传输文件时使用的协议。该协议历史久远,可追溯到 1973 年前后,比 TCP/IP 协议族的出现还要早。
2016-03-04
但时至今日,仍被广泛沿用。
2016-03-04
由于现在已经被 HTTP 协议替代,也已经不怎么使用了。
6.2 HTTP 首部字段
2016-03-04
当 HTTP 报文首部中出现了两个或两个以上具有相同首部字段名时会怎么样?这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
2016-03-04
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的
2016-03-04
还有 Cookie、Set-Cookie 和 Content-Disposition 等在其他 RFC 中定义的首部字段,它们的使用频率也很高。
2016-03-04
下面列举了 HTTP/1.1 中的逐跳首部字段。除这 8 个首部字段之外,其他所有字段都属于端到端首部。
6.7 为 Cookie 服务的首部字段
2016-03-04
调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 Cookie 内的数据不会因来自其他 Web 站点和攻击者的攻击而泄露。
2016-03-04
目前使用最广泛的 Cookie 标准却不是 RFC 中定义的任何一个。而是在网景公司制定的标准上进行扩展后的产物。
第 7 章 确保 Web 安全的 HTTPS
2016-03-04
在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。
7.1 HTTP 的缺点
2016-03-04
通信使用明文(不加密),内容可能会被窃听
不验证通信方的身份,因此有可能遭遇伪装无法证明报文的完整性,所以有可能已遭篡改
2016-03-04
而且,还有像某些特定的 Web 服务器和特定的 Web 浏览器在实际应用中存在的不足(也可以说成是脆弱性或安全漏洞),另外,用 Java 和 PHP 等编程语言开发的 Web 应用也可能存在安全漏洞。
2016-03-04
这是因为,按 TCP/IP 协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视。
2016-03-04
无论世界哪个角落的服务器在和客户端通信时,在此通信线路上的某些网络设备、光缆、计算机等都不可能是个人的私有物,所以不排除某个环节中会遭到恶意窥视行为。
2016-03-04

即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法破解报文信息的含义,但加密处理后的报文信息本身还是会被看到的。
2016-03-04
只需要收集在互联网上流动的数据包(帧)就行了。对于收集来的数据包的解析工作,可交给那些抓包(Packet Capture)或嗅探器(Sniffer)工具。
2016-03-04

下面的图片示例就是被广泛使用的抓包工具 Wireshark。它可以获取 HTTP 协议的请求和响应的内容,并对其进行解析。
2016-03-04
一种方式就是将通信加密。HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全层传输协议)的组合使用,加密 HTTP 的通信内容
2016-03-04
还有一种将参与通信的内容本身加密的方式。由于 HTTP 协议中没有加密机制,那么就对 HTTP 协议传输的内容本身加密。即把 HTTP 报文里所含的内容进行加密处理。
2016-03-04
诚然,为了做到有效的内容加密,前提是要求客户端和服务器同时具备加密和解密机制。主要应用在 Web 服务中。有一点必须引起注意,由于该方式不同于 SSL 或 TLS 将整个通信线路加密处理,所以内容仍有被篡改的风险。稍后我们会加以说明
2016-03-04
HTTP 协议中的请求和响应不会对通信方进行确认。也就是说存在“服务器是否就是发送请求中 URI 真正指定的主机,返回的响应是否真的返回到实际提出请求的客户端”等类似问题。
2016-03-04
另外,服务器只要接收到请求,不管对方是谁都会返回一个响应(但也仅限于发送端的 IP 地址和端口号没有被
2016-03-04
无法确定正在通信的对方是否具备访问权限。因为某些 Web 服务器上保存着重要的信息,只想发给特定用户通信的权限。
无法判定请求是来自何方、出自谁手。
2016-03-04
即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击(Denial of Service,拒绝服务攻击)。
2016-03-04
SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方。
2016-03-04
证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度来说是异常困难的一件事。所以只要能够确认通信方(服务器或客户端)持有的证书,即可判断通信方的真实意图。
2016-03-04
由于 HTTP 协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。
2016-03-04
像这样,请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-
2016-03-04
虽然有使用 HTTP 协议确定报文完整性的方法,但事实上并不便捷、可靠
2016-03-04
不论使用哪一种方法,都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件。浏览器无法自动帮用户检查。
2016-03-04
因为 PGP 和 MD5 本身被改写的话,用户是没有办法意识到的。
2016-03-04
为了有效防止这些弊端,有必要使用 HTTPS
7.2 HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
2016-03-04
如果在 HTTP 协议通信过程中使用未经加密的明文,比如在 Web 页面中输入信用卡号,如果这条通信线路遭到窃听,那么信用卡号就暴露了。
另外,对于 HTTP 来说,服务器也好,客户端也好,都是没有办法确认通信方的。因为很有可能并不是和原本预想的通信方在实际通信。并且还需要考虑到接收到的报文在通信途中已经遭到篡改这一可能性。
其实觉得他这块还没我总结得精炼
2016-03-04
在 Web 的登录页面和购物结算界面等使用 HTTPS 通信
2016-03-04
通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披 SSL 协议这层外壳的 HTTP
2016-03-04
可以说 SSL 是当今世界上应用最为广泛的网络安全技术。
2016-03-04
近代的加密方法中加密算法是公开的,而密钥却是保密的。通过这种方式得以保持加密方法的安全性。
2016-03-04
因为解密过程就是在对离散对数进行求值,这并非轻而易举就能办到。退一步讲,如果能对一个非常大的整数做到快速地因式分解,那么密码破解还是存在希望的
2016-03-04
所以应充分利用两者各自的优势,将多种方法组合起来用于通信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
2016-03-04
那就是无法证明公开密钥本身就是货真价实的公开密钥。
2016-03-04
首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
这个说得很混乱,不如看博客然后自己总结,感觉很可能是翻译的问题,根本不为读者的理解着想
2016-03-04
此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
但是书的话,一般比较严谨
2016-03-04
EV SSL 证书是基于国际标准的认证指导方针颁发的证书。其严格规定了对运营组织是否真实的确认方针,因此,通过认证的 Web 网站能够获得更高的认可度。
2016-03-04
上述机制的原意图是为了防止用户被钓鱼攻击(Phishing),但就效果上来讲,还得打一个问号。很多用户可能不了解 EV SSL 证书相关的知识,因此也不太会留意它。
2016-03-04
HTTPS 中还可以使用客户端证书。以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟服务器证书如出一辙。
2016-03-04
但客户端证书仍存在几处问题点。其中的一个问题点是证书的获取及发布。
想获取证书时,用户得自行安装客户端证书。但由于客户端证书是要付费购买的,且每张证书对应到每位用户也就意味着需支付和用户数对等的费用。另外,要让知识层次不同的用户们自行安装证书,这件事本身也充满了各种挑战。现状是,安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。比如那些可支撑客户端证书支出费用的业务。
例如,银行的网上银行就采用了客户端证书。在登录网银时不仅要求用户确认输入 ID 和密码,还会要求用户的客户端证书,以确认用户是否从特定的终端访问网银。客户端证书存在的另一个问题点是,客户端证书毕竟只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性。也就是说,只要获得了安装有客户端证书的计算机的使用权限,也就意味着同时拥有了客户端证书的使用权限。
忽然理解了为什么有些要初始密码
2016-03-04
是因为建立在其信用绝对可靠这一大前提下的。然而,2011 年 7 月,荷兰的一家名叫 DigiNotar 的认证机构曾遭黑客不法入侵,颁布了 google.com 和 twit
2016-03-04
因为伪造证书上有正规认证机构的数字签名,所以浏览器会判定该证书是正当的。当伪造的证书被用做服务器伪装之时,用户根本无法察觉到。
2016-03-04
如果使用 OpenSSL 这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但该服务器证书在互联网上不可作为证书使用,似乎没什么帮助。
独立构建的认证机构叫做自认证机构,由自认证机构颁发的“无用”证书也被戏称为自签名证书。浏览器访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。

2016-03-04
由自认证机构颁发的服务器证书之所以不起作用,是因为它无法消除伪装的可能性。自认证机构能够产生的作用顶多也就是自己对外宣称“我是○○”的这种程度。即使采用自签名证书,通过 SSL 加密之后,可能偶尔还会看见通信处在安全状态的提示,可那也是有问题的。因为 就算加密通信,也不能排除正在和已经过伪装的假服务器保持通信。
值得信赖的第三方机构介入认证,才能让已植入在浏览器内的认证机构颁布的公开密钥发挥作用,并借此证明服务器的真实性。
2016-03-04
中级认证机构的证书可能会变成自认证证书
2016-03-04
但也有一小部分浏览器会植入中级认证机构的证书。
2016-03-04
步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。步骤 5: SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。
步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
???
2016-03-04
SSL 技术最初是由浏览器开发商网景通信公司率先倡导的,开发过 SSL3.0 之前的版本。目前主导权已转移到 IETF(Internet Engineering Task Force,Internet 工程任务组)的手中。
IETF 以 SSL3.0 为基准,后又制定了 TLS1.0、TLS1.1 和 TLS1.2。TSL 是以 SSL 为原型开发的协议,有
2016-03-04
。当前主流的版本是 SSL3.0 和 TLS1.0。
2016-03-04
由于 SSL1.0 协议在设计之初被发现出了问题,就没有实际投入使用。SSL2.0 也被发现存在问题,所以很多浏览器直接废除了该协议版本。
2016-03-04
HTTPS 也存在一些问题,那就是当使用 SSL 时,它的处理速度会变慢。
2016-03-04
SSL 的慢分两种。一种是指通信慢。另一种是指由于大量消耗 CPU 及内存等资源,导致处理速度变慢。
2016-03-04
其中一个原因是,因为与纯文本通信相比,加密通信会消耗更多的 CPU 及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。
2016-03-04
在进行加密处理时,并非对所有内容都进行加密
2016-03-04
除此之外,想要节约购买证书的开销也是原因之一。
要进行 HTTPS 通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。证书价格可能会根据不同的认证机构略有不同。通常,一年的授权需要数万日元(现在一万日元大约折合 600 人民币)。
第 8 章 确认访问用户身份的认证
2016-03-04
或者干脆仅本人可见。为达到这个目标,必不可少的就是认证功能。下面我们一起来学习一下认证机制。
8.1 何为认证
2016-03-04
密码:只有本人才会知道的字符串信息。
动态令牌:仅限本人持有的设备内显示的一次性密码。数字证书:仅限本人(终端)持有的信息。
生物认证:指纹和虹膜等本人的生理信息。IC 卡等:仅限本人持有的信息。
8.2 BASIC 认证
2016-03-04
BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户 ID 和密码,在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。
2016-03-04
另外,除此之外想再进行一次 BASIC 认证时,一般的浏览器却无法实现认证注销操作,这也是问题之一
8.3 DIGEST 认证
2016-03-04
DIGEST 认证同样使用质询 / 响应的方式(challenge/response),但不会像 BASIC 认证那样直接发送明文密码。
8.5 基于表单认证
2016-03-05
另外,不仅基于表单认证的登录信息及认证过程都无标准化的方法,服务器端应如何保存用户提交的密码等登录信息等也没有标准化。
通常,一种安全的保存方法是,先利用给密码加盐(salt)1 的方式增加额外信息,再使用散列(hash)函数计算出散列值后保存。但是我们也经常看到直接保存明文密码的做法,而这样的做法具有导致密码泄露的风险。
2016-03-05
当两个用户使用了同一个密码时,由于随机生成的 salt 值不同,对应的散列值也将是不同的
9.1 基于 HTTP 的协议
2016-03-05
而这些网站所追求的功能可通过 Web 应用和脚本程序实现。即使这些功能已经满足需求,在性能上却未必最优,这是因为 HTTP 协议上的限制以及自身性能有限。
9.2 消除 HTTP 瓶颈的 SPDY
2016-03-05
Ajax(Asynchronous JavaScript and XML, 异 步 JavaScript 与 XML 技术)是一种有效利用 JavaScript 和 DOM(Document Object Model,文档对象模型)的操作,以达到局部 Web 页面替换加载的异步通信手段。和以前的同步通信相比,由于它只更新一部分页面,响应中传输的数据量会因此而减少,这一优点显而易见。
2016-03-05
而利用 Ajax 实时地从服务器获取内容,有可能会导致大量请求产生。另外,Ajax 仍未解决 HTTP 协议本身存在的问题。
2016-03-05
一旦服务器端有内容更新了,Comet 不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能。
通常,服务器端接收到请求,在处理完毕后就会立即返回响应,但为了实现推送功能,Comet 会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。因此,服务器端一旦有更新,就可以立即反馈给客户端。
2016-03-05
SPDY 没有完全改写 HTTP 协议,而是在 TCP/IP 的应用层与运输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY 规定通信中使用 SSL。
2016-03-05
支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
9.3 使用浏览器进行全双工通信的 WebSocket
2016-03-05
。WebSocket 网络技术正是为解决这些问题而实现的一套新协议及 API。
2016-03-05
一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送 JSON、XML、HTML 或图片等任意格式的数据。
9.5 Web 服务器管理文件的 WebDAV
2016-03-05
是一个可对 Web 服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统
2016-03-05
使用 HTTP/1.1 的 PUT 方法和 DELETE 方法,就可以对 Web 服务器上的文件进行创建和删除操作。可是出于安全性及便捷性等考虑,一般不使用。
2016-03-05
过去,新编写接入互联网的系统或软件时,还需要同时编写实现与必要功能对应的新协议。
2016-03-05
但最近,使用 HTTP 的系统和软件占了绝大多数。
这有着诸多原因,其中与企业或组织的防火墙设定有着莫大的关系。防火墙的基本功能就是禁止非指定的协议和端口号的数据包通过。因此如果使用新协议或端口号则必须修改防火墙设置。
10.1 HTML
2016-03-05
超文本是一种文档系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立关联,即超链接文本。
2016-03-05
我们把出现在 HTML 文档内的这种特殊字符串叫做 HTML 标签(Tag)。
2016-03-05
目前的最新版本是 HTML4.01 标准,1999 年 12 月 W3C(World Wide Web Consortium)组织推荐使用这一版本。下一个版本,预计会在 2014 年左右正式推荐使用 HTML5 标准。
2016-03-05
CSS(Cascading Style Sheets,层叠样式表)可以指定如何展现 HTML 内的各种元素,属于样式表标准之一。
2016-03-05
即使是相同的 HTML 文档,通过改变应用的 CSS,用浏览器看到的页面外观也会随之改变。CSS 的理念就是让文档的结构和设计分离,达到解耦的目的。
10.2 动态 HTML
2016-03-05

所谓动态 HTML(Dynamic HTML),是指使用客户端脚本语言将静态的 HTML 内容变成动态的技术的总称。鼠标单击点开的新闻、Google Maps 等可滚动的地图就用到了动态 HTML。
2016-03-05
通过调用客户端脚本语言 JavaScript,实现对 HTML 的 Web 页面的动态改造
2016-03-05
DOM 是用以操作 HTML 文档和 XML 文档的 API
2016-03-05
使用 DOM 可以将 HTML 内的元素当作对象操作,如取出元素内的字符串、改变那个 CSS 的属性等,使页面的设计发生改变。
2016-03-05
从 JavaScript 的角度来看,将上述 HTML 文档的第 3 个 P 元素(P 标签)改变文字颜色时,会像下方这样编写代码。
2016-03-05
DOM 内存在各种函数,使用它们可查阅 HTML 中的各个元素。
10.3 Web 应用
2016-03-05
原本应用 HTTP 协议的 Web 的机制就是对客户端发来的请求,返回事前准备好的内容。
2016-03-05
引入由程序创建 HTML 内容的做法。
对,对,这个是关键!它不是指有web功能的本地应用,而是指能动态生成网页
2016-03-05
类似这种由程序创建的内容称为动态内容,而事先准备好的内容称为静态内容。Web 应用则作用于动态内容之上。
2016-03-05
CGI(Common Gateway Interface,通用网关接口)是指 Web 服务器在接收到客户端发送过来的请求后转发给程序的一组机制。在 CGI 的作用下,程序会对请求内容做出相应的动作,比如创建 HTML 等动态内容。
2016-03-05
Servlet1 是一种能在服务器上创建动态内容的程序。Servlet 是用 Java 语言实现的一个接口,属于面向企业级 Java(JavaEE,Java Enterprise Edition)的一部分。
2016-03-05
Servlet=Server+Applet,表示轻量服务程序
2016-03-05
Servlet 的运行环境叫做 Web 容器或 Servlet 容器。
2016-03-05
随着 CGI 的普及,每次请求都要启动新 CGI 程序的 CGI 运行机制逐渐变成了性能瓶颈,所以之后 Servlet 和 mod_perl 等可直接在 Web 服务器上运行的程序才得以开发、普及。
10.4 数据发布的格式及语言
2016-03-05
与 HTML 相比,它对数据的记录方式做了特殊处理。
2016-03-05
用浏览器打开该文档时,就会显示排列的列表内容,但如果这些数据被其他程序读取会发生什么?某些程序虽然具备可通过识别布局特征取出文本的方法,但这份 HTML 的样式一旦改变,要读取数据内容也就变得相对困难了。可见,为了保持数据的正确读取,HTML 不适合用来记录数据结构。
因为浏览器只是显示,不是解析
2016-03-05
XML 和 HTML 一样,使用标签构成树形结构,并且可自定义扩展标签。
2016-03-05
从 XML 文档中读取数据比起 HTML 更为简单。由于 XML 的结构基本上都是用标签分割而成的树形结构,因此通过语法分析器(Parser)的解析功能解析 XML
2016-03-05
RSS(简易信息聚合,也叫聚合内容)和 Atom 都是发布新闻或博客日志等更新信息文档的格式的总称。两者都用到了 XML。
2016-03-05
false/null/true/ 对象 / 数组 / 数字 / 字符串,这 7 种类型。
11.1 针对 Web 的攻击技术
2016-03-05
协议本身几乎不会成为攻击的对象
2016-03-05
应用 HTTP 协议的服务器和客户端,以及运行在服务器上的 Web 应用等资源才是攻击目标。
2016-03-05
几乎现今所有的 Web 网站都会使用会话(session)管理、加密处理等安全性方面的功能,而 HTTP 协议内并不具备这些功能。
2016-03-05
因此,开发者需要自行设计并开发认证及会话管理功能来满足 Web 应用的安全。而自行设计就意味着会出现各种形形色色的实现。结果,安全等级并不完备,可仍在运作的 Web 应用背后却隐藏着各种容易被攻击者滥用的安全漏洞的 Bug。
2016-03-05
在 Web 应用中,从浏览器那接收到的 HTTP 请求的全部内容,都可以在客户端自由地变更、篡改。所以 Web 应用可能会接收到与预期 数据不相同的内容。
这个的意思没写明白,确切意思应该是说服务器接受到的http请求是可以是黑客刻意编辑的攻击代码
2016-03-05
在 HTTP 请求报文内加载攻击代码,就能发起对 Web 应用的攻击。通过 URL 查询字段或表单、HTTP 首部、Cookie 等途径把攻击代码传入,若这时 Web 应用存在安全漏洞,那内部信息就会遭到窃取,或被攻击者拿到管理权限。
2016-03-05
主动攻击模式里具有代表性的攻击是 SQL 注入攻
2016-03-05
击和 OS 命令注入攻击。
2016-03-05
在被动攻击过程中,攻击者不直接对目标 Web 应用访问发起攻击。
2016-03-05
步骤 3: 中招后的用户浏览器会把含有攻击代码的 HTTP 请求发送给作为攻击目标的 Web 应用,运行攻击代码。
步骤 4: 执行完攻击代码,存在安全漏洞的 Web
2016-03-05
应用会成为攻击者的跳板,可能导致用户所持的 Cookie 等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果
2016-03-05
被动攻击模式中具有代表性的攻击是跨站脚本攻击和跨站点请求伪造。
2016-03-05
利用用户的身份攻击企业内部网络
利用被动攻击,可发起对原本从互联网上无法直接访问的企业内网等网络的攻击。只要用户踏入攻击者预先设好的陷阱,在用户能够访问到的网络范围内,即使是企业内网也同样会受到攻击。
2016-03-05
很多企业内网依然可以连接到互联网上,访问 Web 网站,或接收互联网发来的邮件。这样就可能给攻击者以可乘之机,诱导用户触发陷阱后对企业内网发动攻击。
11.2 因输出值转义不完全引发的安全漏洞
2016-03-05
从数据库或文件系统、HTML、邮件等输出 Web 应用处理的数据之际,针对输出做值转义处理是一项至关重要的安全策略。当输出值转义不完全时,会因触发攻击者传入的攻击代码,而给输出对象带来损害。
没懂
2016-03-05
动态创建的 HTML 部分有可能隐藏着安全漏洞
2016-03-05
利用虚假输入表单骗取用户个人信息。
利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。显示伪造的文章或图片。
具体方式好低端
2016-03-05
此时的确认界面上,浏览器会把用户输入的 <s> 解析成 HTML 标签,然后显示删除线。
删除线显示出来并不会造成太大的不利后果,但如果换成使用 script 标签将会如何呢。
2016-03-05
下图网站通过地址栏中 URI 的查询字段指定 ID,即相当于在表单内自动填写字符串的功能。而就在这个地方,隐藏着可执行跨站脚本攻击的漏洞。
2016-03-05
充分熟知此处漏洞特点的攻击者,于是就创建了下面这段嵌入恶意代码的 URL。并隐藏植入事先准备好的欺诈邮件中或 Web 页面内,诱使用户去点击该 URL。
哇哇哇!天,就这么简单,所以不要乱扫码!
2016-03-06
当用户在表单内输入 ID 和密码之后,就会直接发送到攻击者的网站(也就是 hackr.jp),导致个人登录信息被窃取。
2016-03-06
操作。如果在调用 SQL 语句的方式上存在疏漏,就有可能执行被恶意注入(Injection)非法 SQL 语句。
2016-03-06
URL 的查询字段已指定 q= 上野宣,这个值由 Web 应用传入到 SQL 语句中,构成下方的 SQL 语句。
2016-03-06
把刚才指定查询字段的上野宣改写成“上野宣'--”。
2016-03-06
SQL 语句中的 -- 之后全视为注释。即,and flag=1 这个条件被自动忽略了。
2016-03-06
SQL 注入是攻击者将 SQL 语句改变成开发者意想不到的形式以达到破坏结构的攻击。
2016-03-06
本案例中的问题仅仅是把未出版书籍的条目也一同显示出来了。但实际发生 SQL 注入攻击时,很有可能会导致用户信息或结算内容等其他数据表的非法浏览及篡改,从而使用户遭受不同程度的损失。
2016-03-06
OS 命令注入攻击(OS Command Injection)是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。只要在能调用 Shell 函数的地方就有存在被攻击的风险。
2016-03-06
也就是说,通过 OS 注入攻击可执行 OS 上安装着的各种程序。
2016-03-06
攻击者的输入值中含有分号(;)。这个符号在 OS 命令中,会被解析为分隔多个执行命令的标记。
2016-03-06
HTTP 首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式。
2016-03-06
此刻,首部字段 Set-Cookie 已生效,因此攻击者可指定修改任意的 Cookie 信息。通过和会话固定攻击(攻击者可使用指定的会话 ID)攻击组合,攻击者可伪装成用户。
攻击者输入的 %0D%0A,原本应该属于首部字段 Location 的查询值部分,但经过解析后,%0D%0A 变成了换行符,结果插入了新的首部字段。这样一来,攻击者可在响应中插入任意的首部字段。
2016-03-06
利用这两个连续的换行就可作出 HTTP 首部与主体分隔所需的空行了,这样就能显示伪造的主体,达到攻击目的。这样的攻击叫做 HTTP 响应截断攻击。
2016-03-06
通过 Web 应用对文件处理操作时,在由外部指定文件名的处理存在疏漏的情况下,用户可使用 .../ 等相对路径定位到 /etc/passed 等绝对路径上,因此服务器上任意的文件或文件目录皆有可能被访问到。这样一来,就有可能非法浏览、篡改或删除 Web 服务器上的文件。
11.3 因设置或设计上的缺陷引发的安全漏洞
2016-03-05
错误设置 Web 服务器,或是由设计上的一些问题引起的安全漏洞。
2016-03-05
强制浏览(Forced Browsing)安全漏洞是指,从安置在 Web 服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。
2016-03-05
直接显示容易推测的文件名或文件目录索引时,通过某些方法可能会使 URL 产生泄露。
2016-03-05
http://www.example.com/log/
通过指定文件目录名称,即可在文件一览中看到显示的文件名。容易被推测的文件名及目录名
http://www.example.com/entry/entry_081202.log文件名称容易推测(按上面的情况,可推出下一个文件是 entry_081203.log)
备份文件http://www.example.com/cgi-bin/entry.cgi(原始文件)
http://www.example.com/cgi-bin/entry.cgi~(备份文件)http://www.example.com/cgi-bin/entry.bak(备份文件)
由编辑软件自动生成的备份文件无执行权限,有可能直接以源代码形式显示
2016-03-06
即使没有对这篇日记的访问权限,只要知道这图片的 URL,通过直接指定 URL 的方式就能显示该图片。日记的功能和文本具有访问对象的控制,但不具备对图片访问对象的控制,从而产生了安全漏洞。
2016-03-06
Web 应用不必在用户的浏览画面上展现详细的错误消息。对攻击者来说,详细的错误消息有可能给他们下一次攻击以提示。
2016-03-06
攻击者利用进行不同的输入会提示不同的错误信息这条,就可用来确认输入的邮件地址是否已在这个 Web 网站上注册过了。
为了不让错误消息给攻击者以启发,建议将提示消息的内容仅保留到“认证错误”这种程度即可
2016-03-06
攻击者从这条消息中可读出数据库选用的是 MySQL,甚至还看见了 SQL 语句的片段。这可能给攻击者进行 SQL 注入攻击以启发。
2016-03-06
假如指定的重定向 URL 到某个具有恶意的 Web 网站,那么用户就会被诱导至那个 Web 网站。
11.4 因会话管理疏忽引发的安全漏洞
2016-03-06
会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的
2016-03-07
通过非正规的生成方法推测会话 ID
通过窃听或 XSS 攻击盗取会话 ID通过会话固定攻击(Session Fixation)强行获取会话 ID
2016-03-07
这个 Web 网站的认证功能,会在认证前发布一个会话 ID,若认证成功,就会在服务器内改变认证状态。
2016-03-07
跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
2016-03-07
攻击者设置好一旦用户访问,即会发送在留言板上发表非主观行为产生的评论的请求的陷阱。用户 A 的浏览器执行完陷阱中的请求后,留言板上也就会留下那条评论(步骤②)。
11.5 其他安全漏洞
2016-03-07
密码破解有以下两种手段。
通过网络的密码试错对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)
2016-03-07
除去突破认证的攻击手段,还有 SQL 注入攻击逃避认证,跨站脚本攻击窃取密码信息等方法
2016-03-07
因为穷举法会尝试所有的候选密码,所以是一种必然能够破解密码的攻击。但是,当密钥空间很庞大时,解密可能需要花费数年,甚至千年的时间,因此从现实角度考量,攻击是失败的。
2016-03-07
Web 应用在保存密码时,一般不会直接以明文的方式保存,通过散列函数做散列处理或加 salt 的手段对要保存的密码本身加密。那即使攻击者使用某些手段窃取密码数据,如果想要真正使用这些密码,则必须先通过解码等手段,把加密处理的密码还原成明文形式。
2016-03-07
彩虹表
彩虹表(Rainbow Table)是由明文密码及与之对应的散列值构成的一张数据库表,是一种通过事先制作庞大的彩虹表,可在穷举法 • 字典攻击等实际破解过程中缩短消耗时间的技巧。从彩虹表内搜索散列值就可以推导出对应的明文密码。
2016-03-07
为了提高攻击成功率,拥有一张海量数据的彩虹表就成了必不可少的条件。例如在 Free Rainbow Tables 网站上(http://www.freerainbowtables.com/en/tables2/)公布的一张由大小写字母及数字全排列的 1~8 位字符串对应的 MD5 散列值构成的彩虹表,其大小约为 1050 吉字节。
2016-03-07
而 Web 应用开发者独立实现的加密算法,想必尚未经过充分的验证,还是很有可能存在漏洞的。
2016-03-07
点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在 Web 页面之上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing)。
2016-03-07
攻击者在预料用户会点击的 Web 页面上设下陷阱。上图中钓鱼游戏页面上的 PLAY 按钮就是这类陷阱的实例。
在做过手脚的 Web 页面上,目标的 SNS 注销功能页面将作为透明层覆盖在游戏网页上。覆盖时,要保证 PLAY 按钮与注销按钮的页面所在位置保持一致。
2016-03-07
主要有以下两种 DoS 攻击方式。
集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态。通过攻击安全漏洞使服务停止。
2016-03-07
服务器很难分辨何为正常请求,何为攻击请求,因此很难防止 DoS 攻击。
2016-03-07
通常的后门程序分为以下 3 种类型。
开发阶段作为 Debug 调用的后门程序开发者为了自身利益植入的后门程序
攻击者通过某种方法设置的后门程序
posted @ 2016-03-07 10:16  赛艇队长  阅读(558)  评论(0编辑  收藏  举报