Http协议

Posted by Wh0ami-hy on December 5, 2023

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

服务器先给浏览器发送一个公钥。浏览器利用该公钥生成一个加密的密钥并发送给服务器,服务器利用私钥解密得到密钥,之后双方再利用这个密钥进行对称加密传输。整个过程是:先利用非对称加密把密钥传输到服务器上,之后再利用这个密钥进行对称加密的通信


本站总访问量