Author: Yu Li
date: 2020/07/18
- Chapter1 了解Web及网络基础
- Chapter2 简单的HTTP协议
- Chapter3 HTTP报文内的HTTP信息
- Chapter4 返回结果的HTTP状态码
- Chapter5 与HTTP协作的Web服务器
- Chapter6 HTTP首部
- Chapter7 确保Web安全的HTTPS
- Chapter8 确认访问用户身份的认证
- Chapter9 基于HTTP的功能追加协议
- Chapter10 构建web内容的技术
- Chapter11 Web的攻击技术
- TCP/IP协议族各层的作用:
应用层:决定通信的活动,如FTP、HTTP和DNS
传输层:提供数据传输协议,如TCP和UDP
网络层:处理网络上流动的数据包,选择传输路线,即IP协议
链路层:硬件设备,如网卡、光纤等
- TCP/IP通信传输流:客户端>HTTP>TCP>IP>网络>IP>TCP>HTTP>服务器
客户端每经过一层就加一个首部,服务器每经过一层就去掉一个首部信息。
- 与HTTP密不可分的三个协议:IP、TCP、DNS
IP:两个重要部分是IP地址和MAC地址(Media Access Control Address)
IP地址指明节点被分配到的地址,MAC地址是指网卡所属固定地址。IP和MAC可配对,IP可变,MAC基本不变。
ARP协议(Address Resolution Protocol)可以解析地址,根据通信方的IP地址就可以反查出对应的MAC地址。
TCP:提供可靠的字节流服务(Byte Stream Service),即把大块数据分割成报文段(segment)为单位的数据包进行管理。
三次握手(Three-way handshaking):发送端先发一个带SYN标志的数据包,接收端收到后回传一个带SYN+ACK标志的数据包表示传达确认,最后发送方再回传一个带ACK标志的数据包,表示握手结束。若握手过程中某阶段中断,TCP会再次以相同顺序发送相同数据包。
四次挥手:一方发送FIN数据包,另一方回复ACK,结束单方面连接。另一方发送FIN,一方回复ACK,结束另一方的连接。
ACK —— 确认,使得确认号有效。 RST —— 重置连接(经常看到的reset by peer)就是此字段搞的鬼。 SYN —— 用于初如化一个连接的序列号。 FIN —— 该报文段的发送方已经结束向对方发送数据。
DNS:提供域名和IP地址之间的解析服务
相比域名,计算机更擅长处理IP
- URI和URL
URI用字符串标识某一互联网资源,而URL表示资源地点,所以URL是URI的子集。
- 请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
例如:
GET /index.htm HTTP/1.1
Host: hackr.jp
Connection: keep-alive
Content-Length: 16
...
name=ueno&age=37
- 响应报文是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段及实体主体构成。
例如:
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length:362
Content-Type: text/html
...
<html>
...
-
HTTP是无状态协议(stateless),即协议对于发送过的请求或响应都不做持久化处理。但为了实现保持状态的功能,引入了Cookie技术。
-
HTTP方法
GET:获取资源
POST:传输实体主体
PUT:传输文件
HEAD:获得报文首部
DELETE:删除文件
OPTIONS:询问支持的方法
TRACE:追踪路径
CONNECT:要求用隧道协议连接代理
- 持久连接节省通信量
因为一次HTTP通信就要断开一次TCP连接
HTTP keep-alive特点,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
HTTP/1.1中所有连接默认都是持久连接
,HTTP/1.0未标准化。好处在于减少了TCP连接的重复建立和断开造成的额外开销,减轻服务端的负载。
管线化
(pipelining):从前请求是串行的,管线化技术可以实现并行发送多个请求。
- 使用Cookie的状态管理
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,下次客户端再往该服务器发送请求,客户端会自动在请求报文中加入Cookie指后发送。服务端接收到Cookie会检查记录,得到之前的状态信息。
-
HTTP报文可分为报文首部和报文主体两块,由最初出现的空行(CR+LF)来划分。报文主体可以没有。
请求报文首部: 请求行 请求首部字段 通用首部字段 实体首部字段 其他 响应报文首部: 状态行 响应首部字段 通用首部字段 实体首部字段 其他
-
编码提升传输速率
内容编码+分块传输
- 发送多种数据的多部份对象集合
有以下几种Content-Type:
multipart/form-data
multipart/byteranges
- 内容协商包括:服务器驱动协商、客户端驱动协商、透明协商
- 状态码
类别 | 原因短语 | |
---|---|---|
1XX | Informational信息性 | 接收的请求正在处理 |
2XX | Success成功 | 请求正常处理完毕 |
3XX | Redirection重定向 | 需要进行附加操作已完成请求 |
4XX | Client Error客户端错误 | 服务器无法处理请求 |
5XX | server Error服务器错误 | 服务器处理请求出错 |
- 14个具体状态码
状态码 | 含义 |
---|---|
200 | 正常处理 |
204 | 处理成功,但没资源返回 |
206 | 处理成功,返回一部分资源 |
301 | 永久性重定向,资源被分配到新URI |
302 | 临时重定向 |
303 | URI已更新,应用GET方法请求新URI |
304 | Not Modified没修改,可以使用缓存 |
307 | 临时重定向,同302 |
400 | 请求报文存在错误语法 |
401 | 第一次表示请求需要HTTP认证,第二次表示认证失败 |
403 | 拒绝访问 |
404 | Not Found |
405 | Method Not Allowed |
500 | 服务器故障 |
503 | 服务器超负载或正在停机维护,无法处理请求 |
-
单台虚拟主机实现多个域名,即IP绑多个域名
-
通信数据转发程序:代理、网关、隧道
代理:是一种有转发功能的应用程序,接收客户端返送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端
网关:转发其他服务器通信数据的服务器,接收从客户端发来的请求时,对请求进行转发
隧道:相隔很远的客户端和服务器两者之间中转,保持双方通信连接的应用程序
-
使用代理服务器的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制等
-
代理分类:
缓存代理:转发时预先将资源的副本保存在代理服务器,再次请求相同资源时,就不从源服务器获取资源,而是将之前的缓存资源作为响应返回
透明代理:不对报文做任何加工的代理
非透明代理:对报文内容加工的代理
-
网关:工作机制和代理十分相似,而网关能使服务器提供非HTTP协议服务。利用网关可以提高通信的安全新,因为可以在客户端与网关之间通信线路上加密以确保连接的安全。网关可以连接数据库、和信用卡结算系统联动
-
隧道:可按要求建立与其他服务器的通信线路,届时使用SSL等机密手段进行通信。目的是确保客户端能与服务器进行安全通信。隧道不解析HTTP请求,保持原样转发给服务器。
-
保存资源的缓存
缓存指的是代理服务器或客户端本地磁盘内保存的资源副本。
缓存会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器会再次从源服务器上获取新资源。
-
首部字段重复,不同浏览器处理逻辑不同。
-
4种HTTP首部字段类型
名称 | 作用 |
---|---|
通用首部字段 | 请求报文和响应报文都会使用的首部 |
请求首部字段 | 客户端-》服务器 |
响应首部字段 | 服务器-》客户端 |
实体首部字段 | 针对实体使用的首部 |
-
HTTP/1.1定义了47种首部字段,详见pdf p80
-
Cache-Control:
no-cache:不缓存过期资源
no-store:不缓存
-
HTTP/1.1遇到max-age和Expires首部,会优先处理max-age
-
nginx中etag是由Last-Modified 与 Content-Length计算得到,而 last_modified 又由 mtime 组成。当编辑文件却未更改文件内容时,或者 touch file,mtime 也会改变,此时 etag 改变,但是文件内容没有更改。
-
两种协商缓存:
Last-Modified/if-Modified-Since
ETag/If-None-Match
-
Expires会将资源失效的日期告知客户端。
-
Set-Cookie字段属性
属性 | 说明 |
---|---|
NAME=VALUE | Cookie名 |
expires=DATE | Cookie有效期 |
path=PATH | 服务器上的文件目录作为Cookie的适用对象 |
domain=域名 | 作为Cookie适用对象的域名 |
Secure | 仅在HTTPS安全通信时才会发送Cookie |
HttpOnly | Cookie不能被JS脚本访问,防止XSS攻击 |
-
HTTP不足:
通信用明文,内容可能被窃听 不验证通信方身份,有可能伪装 无法证明报文完整性,可能已篡改
-
加密有两种方式:
通信加密:SSL+HTTP=》HTTPS
内容加密:报文主体加密和解密机制
- HTTP+加密+认证+完整性保护=HTTPS
HTTPS并非是应用层的新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
通常HTTP直接和TCP通信,使用SSL后,演变成先和SSL通信,再由SSL和TCP通信。
- 共享密匙:对称加密,加密和解密用同样的密匙
公开密匙:非对称加密,一把公开密匙,一把私有密匙。用公开密匙加密,用私有密匙解密,不担心密匙泄露。
公开密匙比共享密匙处理速度慢很多
-
HTTPS采用混合加密机制:首先通过公开密匙方式交换共享密匙用的密匙,然后利用共享密匙进行通信。
-
SSL之所以慢,有两部分原因:一是SSL通信,二是加密处理。
-
HTTP使用的认证方式包括:
BASIC认证(基本认证) DIGEST认证(摘要认证) SSL客户端认证 FormBase认证(基于表单认证)
-
BASIC认证对 用户名:密码 采用Base64编码,可以被解码,安全性不高
-
DIGEST认证由服务端发送质询码(随机数nonce)和realm,客户端回传username(realm限定范围内可认证的用户名)和response响应码(MD5运算后的密码字符串)。
-
SSL客户端认证
服务器发送Certificate Request报文,要求客户端提供证书
客户端把证书以Client Certificate报文方式发给服务器
服务端验证证书通过,领取证书内公匙,然后开始HTTPS加密通信
- 表单认证
客户端把ID和密码通过POST方法发送给服务端
服务端把SessionID记录下来,并在响应首部加入set-cookie写入SessionID,为防止XSS攻击,建议在Cookie内加上httponly属性
客户端把sessionID存入cookie,下次发请求自动带上cookie
- SPDY目的是解决HTTP性能瓶颈
SPDY在应用层(HTTP)和表示层(SSL)之间插入了会话层(SPDY),具有以下功能:
多路复用流
赋予请求优先级
压缩HTTP首部
推送功能(服务器主动向客户端推送数据)
服务器提示功能
- WebSocket协议:是对HTTP协议的升级
其主要特点是:推送功能和减少通信量(长连接+首部信息量少)。
请求首部如下:
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
响应首部如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: ...
Sec-WebSocket-Protocol: chat
- HTTP/2.0特点
// to do...
无
- Web应用的攻击模式有两种:主动攻击和被动攻击
主动攻击,最具代表性的攻击是SQL注入攻击和OS命令注入攻击
被动攻击是指利用圈套策略执行攻击代码的攻击模式。攻击模式如下:
诱使用户触发设计的陷阱,发送嵌入攻击代码的HTTP请求;执行攻击代码,可能导致用户Cookie等个人信息被窃取,用户权限遭到滥用。最具代表性的就是跨站脚本攻击(XSS)和跨站点请求伪造(CSRF)
- 因输出值转义不完全引发的安全漏洞
客户端验证
Web应用端验证:输入值验证+输出值转义
输出值转义的意思是:如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字符。这样可以防止<script>这类脚本标签转为字符串而不执行。
-
XSS利用虚假输入表单骗取用户个人信息或Cookie,显示伪造的文章或图片
-
SQL注入攻击,如
SELECT * FROM table1 WHERE author='xxx'--' and flag=1
SQL语句会把--后的内容无视所以and flag=1条件就被忽略了
- HTTP首部注入攻击
如
101%0D%0ASet-Cookie:+SID=12345
101%0D%0A
表示换行
- HTTP响应截断攻击
101%0D%0A101%0D%0A...
两个换行,将报文首部和主体分开,触发用户页面显示伪造Web页面
- Dos攻击:一种让运行的服务呈停止状态的攻击,有两种方式:
集中利用访问请求造成资源过载,资源用尽后,服务呈停止状态
通过攻击安全漏洞使服务停止