1. web及网络基础
1.1. http1.0
1.2. http1.1
1.3. TCP/IP协议族
1.3.1. IP协议
作用:把各种数据包传送给对方
IP地址
指明节点被分配到的地址
MAC地址
- 网卡所属的固定地址
- ARP协议依赖MAC地址进行通信
1.3.2. TCP协议
- 提供字节流服务:将大块数据分割为报文段进行传输
- 三次握手
- 四次挥手
1.3.3. DNS服务
- 将域名和IP地址相互映射
- 对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符
1.4. URI
统一资源标识符
1.4.1. 格式
- 登录信息()
- 服务器地址
- 服务器端口号
- 带层次的文件路径
- 查询字符串
- 片段标识符
1.5. URL
统一资源定位符
URL:是URI常用协议的一个子集
1.5.1. 组成
- 第一部分:协议,如:HTTP、FTP、MHTML等
- 第二部分:主机的IP地址,有时也包括端口
- 第三部分:资源文件名,通常包含目录在内
2. 简单的HTTP协议1.1
2.1. 持久连接问题
HTTP keep-alive
解决了HTTP1.0每通信一次就断开TCP连接的问题
管线化
无需等待响应,可并行发送多个请求
2.2. 无状态协议
- 每次http通信都需要重新验证用户身份
- 解决方法:cookie技术。服务器响应报文中的Set-Cookie通知客户端保存Cookie
2.3. 请求URI
不是访问特定资源而是对服务器本身发起的请求使用 ` * ` 代替URI
2.4. 请求与响应的通信
2.4.1. 请求方法
报文中起始行的开头
注:方法名区分大小写
-
GET(获取资源)
-
POST(传输实体主体)
-
PUT(传输文件):自身不带验证机制
-
HEAD(获得报文首部):用于确认URI的有效性
-
DELETE(删除资源):自身不带验证机制
-
OPTIONS(询问支持的方法)
-
TRACE(追踪路径):确认连接过程中发生的一系列操作
-
CONNECT(要求用隧道协议连接代理):实现用隧道协议进行TCP通信,CONNECT 代理服务器名 :端口号 HTTP版本
- TLS协议
- SSL协议
3. HTTP报文
3.1. 概念
报文
HTTP通信中的基本单位,由8位组字节流组成
HTTP协议交互的信息
- 报文首部
- 报文主体
注:报文首部与报文主体用 CR + LF (回车符+换行符)实现空行,十六进制为 0x0d 和 0x0a
实体
作为请求或响应的有效载荷数据被传输
- 实体首部
-
实体主体
- 注:通常,报文主体等于实体主体,只有当传输内容进行编码操作时,二者才会不同。
3.2. 编码提升传输速率
3.2.1. 内容编码
实体信息原样压缩
- gzip
- deflate(zlib)
- identity(不进行编码)
3.2.2. 分块传输编码
把大量数据分割成块
3.3. 多部分对象集合
3.4. 范围请求
3.5. 内容协商
3.6. HTTP报文的组成
4. HTTP状态码
注:状态码经常与状态不一致
1xx
信息性状态码
2xx
成功状态码
3xx
重定向状态码
4xx
客户端错误状态码
5xx
服务器错误状态码
5. 与HTTP协作的web服务器
5.1. 单个主机托管多个域名
多个域名指向同一ip地址,请求访问时需在Host中指明完整的主机名或域名的URL
5.2. 通信数据转发
5.2.1. 代理
- 不改变请求URL
- 通过代理服务器的请求或响应会追加写入Via首部信息
分类1
- 缓存代理(Caching proxy):将资源副本保存在服务器上
- 透明代理(Transparent proxy):不对报文做任何加工
分类2
- 正向代理
- 目标服务器是不知道真正的客户端是谁
- 客户端知道代理服务器和web服务器的存在
- 可以隐藏客户端真实IP
- 反向代理(CDN)
- 客户端是不知道真正的目标服务器是谁
- 客户端不知道web服务器的存在
- 隐藏服务器真实IP
5.2.2. 网关
- 能使通信线路上的服务器提供非HTTP协议服务
- 提高通信的安全性
5.2.3. 隧道
- 实现远距离的安全通信
- SSL加密
6. HTTP首部
6.1. 请求报文
- 方法
- URI
- HTTP版本
- HTTP首部字段
6.2. 响应报文
- HTTP版本
- 状态码
- HTTP首部字段
6.3. HTTP首部字段
6.3.1. 实际用途分类
通用首部字段
Cache-Control | 控制缓存的行为 |
---|---|
Connection | 逐挑首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求
Accept | 用户代理可处理的媒体类型 |
---|---|
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与 If-Macth 相反) |
If-Range | 资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与 If-Modified-Since 相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 表示从哪儿链接到目前的网页,采用的格式是URL |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
响应
Accept-Ranges | 是否接受字节范围请求 |
---|---|
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定 URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP 服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体
Allow | 资源可支持的 HTTP 方法 |
---|---|
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的 URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
6.3.2. 缓存代理/非缓存代理
- 端到端首部(End-to-end Header)
- 此类别中的首部会转发给最终的接收目标,且必须保存在由缓存生成的响应中,另外规定,它必须被转发
- 逐跳首部(Hop-by-hop Header)
- 只对单次转发有效,会因通过缓存或代理而不再转发
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
- 注:除以上8个,其他都属于端到端
- 只对单次转发有效,会因通过缓存或代理而不再转发
6.3.3. 为Cookie服务的首部字段
-
Set-Cookie(响应首部字段)
属性
-
NAME=VALUE
Cookie的名称和值
-
expires=DATE
Cookie的有效期
-
path=PATH
将服务器上的文件目录作为Cookie的适用对象
-
domain=域名
作为Cookie适用对象的域名
-
Secure
仅在HTTPS安全连接时才会发送Cookie
-
HttpOnly
使Cookie不能被JavaScript脚本访问
- 防止XSS跨站脚本攻击
-
-
Cookie(请求首部字段)
6.3.4. 其他首部字段
-
X-Frame-Options
防止点击劫持攻击
-
X-XSS-Protection
防止XSS跨站攻击
-
DNT
-
P3P
7. HTTPS
7.1. HTTP缺点
-
HTTP的防篡改措施
- SHA-1
- MD5
-
明文传输
-
无法验证通信方身份
接收大量无意义的请求,导致DoS攻击(拒绝服务攻击)
-
无法验证报文的完整性
报文可能被修改,导致中间人攻击(MITM)
7.2. HTTP+SSL
7.2.1. 加密
-
对称密钥加密(共享密钥加密)
解密与加密使用同一密钥,所以密钥会发送给解密之人
-
公开密钥加密
一对非对称密钥
-
私有密钥
解密方使用该密钥解密
-
公开密钥
加密方使用该密钥进行加密
-
-
总结:公开密钥加密解决了共享密钥在传输时被窃取的危险
-
HTTPS的混合加密
- 在交换密钥环节使用公开密钥加密,建立通信后,使用共享密钥加密
7.2.2. 认证
-
查找证书
-
公钥证书(数字证书)
解决公钥在传输过程中可能被替换的问题
8. 确认用户访问身份的认证
8.1. HTTP的认证方式
8.1.1. BASIC认证
- 发送请求后收到 状态码401,然后客户端将账户密码用 : 连接,再base64加密后传输给服务器
8.1.2. DIGEST认证(摘要认证)
- 可防止窃听,但不防止用户伪装
- 质询/响应的方式
8.1.3. SSL客户端认证
- 客户端证书认证
- 双因素认证
- 客户端认证
- 表单认证
8.1.4. FormBase认证(基于表单认证)
- Cookie管理Session(会话)
- Session是指用户从打开浏览器访问服务器到关闭浏览器之间的会话状态,在一个会话期间,服务器会自动分配一个标识SessionId。Session可以存储用户访问服务器的一些传递资料信息
- Session对象和Cookie对象相比的差别在于,Cookie存储在客户端的浏览器中,而Session对象存储在服务器端
- 存在XSS攻击
9. 基于 HTTP的其他协议
9.1. HTTP缺点
SNS(社交网络服务)需要实时更新网页内容,导致频繁的从客户端到服务端访问,若没有内容更新,则会浪费资源
9.2. 解决方法
9.2.1. Ajax
(异步+JavaScript+XML)
- 核心:API : XMLHttpRequest
- 通过调用JavaScript脚本与服务器建立通信,从web页面发起请求,更新局部内容
- 缺点:产生大量请求
9.2.2. Comet
- 延迟应答
- 接到请求后先将挂起,待服务端有内容更新时,再返回响应
- 缺点:为了维持连接 ,会消耗较多资源
9.2.3. SPDY
- 以会话层的形式加入
- 功能
- 多路复用流
- 赋予请求优先级
- 压缩HTTP首部
- 推送功能
- 服务器提示功能
9.2.4. WebSocket
10. 构建web内容的技术
10.1. HTML
10.2. CSS
10.3. JavaScript
- 动态HTML
10.4. DOM
- 用来操作HTML和XML的API
10.5. web应用
10.5.1. 内容
- 静态内容
- 动态内容
- 由程序创建
10.5.2. CGI
(Common Gateway Interface-通用网关接口)
-
它是网页的表单和你写的程序之间通信的一种协议。可以用任何语言写一个CGI脚本,这些语言只要能接收输入输出信息,读取环境变量
-
CGI脚本的结构
-
读取用户提交表单的信息
-
处理这些信息(也就是实现业务)
-
输出,返回html响应(返回处理完的数据)
-
10.5.3. Servlet
- 运行的环境:Web容器或Servlet容器
- 优点:运行在与web服务器相同的进程中,受到的负载小,而CGI每次接受请求都要启动,访问量大时,会导致服务器负载过大
10.6. 数据发布的格式及语言
- XML(可拓展标记语言)
- 使数据容易读取
- 发布更新信息的RSS/Atom
- JSON
11. web的攻击技术
11.1. 攻击类别
11.1.1. 被动攻击(设计陷阱使用户触发,执行攻击代码)
- XSS
- HTTP首部注入攻击
- 会话固定攻击
- 跨站点请求伪造(CSRF)
11.1.2. 主动攻击(直接访问web应用,传入攻击代码)
- SQL注入
- 非法查看或篡改数据
- 规避认证
- 执行相关程序
- OS命令注入
- 原理:通过web应用调用shell执行非法的操作系统命令
11.2. 因输出值转义不完全导致的漏洞
11.2.1. XSS
- 原理:通过web网站的注册用户的浏览器内运行非法HTML标签或JavaScript
- 危害
- 利用脚本窃取用户Cookie
- 显示伪造的文章/图片
- 利用虚假输入表单骗取用户信息
11.2.2. HTTP首部注入攻击
- 原理:在响应首部字段内插入换行,添加任意响应首部或主体
- 注意:
%0D%0A
代表HTTP报文中的换行符 - 危害
- 设置任何Cookie信息
- 重定向至任何URL
- 显示任意的主体(HTTP响应截断攻击)
11.2.3. HTTP响应截断攻击
- 注:
%0D%0A%0D%0A
两个连续的换行实现HTTP首部与主体分隔所需的空行 - 利用插入字符串
%0D%0A%0D%0A
可实现伪造主体 - 危害
- 用户浏览器显示伪造的web页面
- 邮件首部注入攻击
- 利用web应用中的邮件发送功能
- 向邮件首部To或Subject内添加任意非法内容
- 目录遍历攻击
- 子主题 1
- 远程文件包含漏洞
- PHP的include 和 require ,5.2.0版本以后默认无效
- 原理:部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,当脚本读取后,就可运行任意脚本
11.3. 因设计缺陷导致的漏洞
11.3.1. 强制浏览
- 推测文件名及目录
- 浏览由软件自动生成的备份文件
- 浏览经认证才可显示的文件
11.3.2. 不正确的错误消息处理
- 根据错误提示信息,得到其他信息
11.3.3. 开放重定向
- URL跳转
11.4. 因会话管理疏忽导致的漏洞
11.4.1. 会话劫持
- 获取用户会话ID
- 获取途径
- 推测会话ID
- 窃听或XSS攻击盗取
- 会话固定攻击强行获取
11.4.2. 会话固定攻击
- 强制用户使用攻击者指定的会话ID
- Session Adoption
- PHP或ASP.NET能够接受处理未知会话ID的功能
11.4.3. 跨站点请求伪造(CSRF)
- 强制对已完成认证的用户进行非预期的信息更新
11.5. 其他
11.5.1. 缓存污染
11.5.2. 密码破解
- 通过网络的密码试错
- 穷举法
- 字典攻击
- 对已加密的密码破解
- 穷举/字典
- 彩虹表
- 拿到密钥
- 加密算法的漏洞
11.5.3. 点击劫持
- 利用透明的按钮或链接,覆盖在web页面上吗,做成陷阱
11.5.4. DoS攻击
- 同时发送大量请求,使服务器停止服务
12. https
服务器先给浏览器发送一个公钥。浏览器利用该公钥生成一个加密的密钥并发送给服务器,服务器利用私钥解密得到密钥,之后双方再利用这个密钥进行对称加密传输。整个过程是:先利用非对称加密把密钥传输到服务器上,之后再利用这个密钥进行对称加密的通信