网络协议科普: http的请求与响应

436 阅读5分钟

本文正在参与 “网络协议必知必会”征文活动

DNS寻址

DNS寻址.png

  • 输入http://www.baidu.com
  • 本机hosts里有没有www.baidu.com
    • 本机hosts里没有
  • 本地DNS缓存服务器(网络运营商,或者自建局域网的dns服务)里有没有www.baidu.com
    • 有:www.baidu.com这个域名的IP是XX.XX.XX.XX
    • 无:联系根域名DNS服务器,询问
  • 根域名DNS服务器
    • 有:www.baidu.com这个域名的IP是XX.XX.XX.XX
    • 无:无法访问网页
    • 根域名服务器的类型
  • 在本地和根域名之间还可能存在多个DNS中间层
    • 权限域名服务区:一个服务器所负责管理的范围叫区
    • 顶级域名服务商:既TLD服务器,这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。aliyunDNS qqdns

111.png

HTTP

HTTP协议

超文本传输协议HTTP(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议.

HTTP协议通常承载于TCP协议之上.

发起请求

请求.png

  • 请求行
    • method GET POST HEAD PUT DELETE TRACE CONNECT OPTIONS
    • RequestURL http://wwww.baidu.com
    • HttpVersion Htp 1.1
  • 消息报头
    • Accept 指定客户端接受哪些类型的信息/MIME image/gif text/html
    • Accept-Charset 客户端接受的字符集 gb2312 utf-8
    • Accept-Encoding 可接受的内容编码 gzip identity
    • Accept-Language 指定一种自然语言 zh-cn
    • Authorization 证明客户端有权查看某个资源
    • Host 指定被请求的Internet主机和端口号 192.168.0.110:8080
    • User-Agent 用户代理
      • 操作系统版本
      • CPU类型
      • 浏览器及版本
      • 浏览器渲染引擎
      • 浏览器语言
      • 浏览器插件
    • Content-Type Body的编码方式
  • 请求正文 根据头部的Content-Type确定
    • application/x-www-form-urlencoded eg:key=value&name=jone
    • application/json 序列化后的JSON字符串/ajax
    • text/xml XML作为编码方式的远程调用规范
    • text/plain 数据以纯文本形式(txet/json/xml/html)进行编码
    • multipart/form-date 文本数据/文件等的二进制数据,允许在数据中心包含整个文件,所以常用于文件上传

处理响应

响应.png

  • 状态行 状态码

    • 1xx 指示信息 表示请求已接受 继续处理
    • 2xx 成功 请求已被成功接收、理解
    • 3xx 重定向 要完成请求必须进行更进一步的操作
    • 4xx 客户端错误 语法有错误 或者请求无法实现
    • 5xx 服务端错误 服务器未能实现合法请求
  • 消息报头

    • 响应报头
      • location 重定向接受者到一个新的位置
      • WWW-Authenticate 包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
    • 实体报头
      • Content-Encoding 媒体类型的修饰符 eg:Content-Encoding:gzip
      • Content-Language 资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
      • Content-Length 正文的长度,以字节方式存储的十进制数字来表示
      • Content-Type 实体报头域用语指明发送给接收者的实体正文的媒体类型
      • Expires 响应过期的日期和时间
      • Etag
      • Pragma
  • 响应正文

安全的HTTP

同源策略( Same-origin policy )

它允许来自同一站点的资源进行互相访问而不受限制,但是会阻止其他不同站点对文档/资源的访问。换句话说它可以阻止另一个站点通过脚本来操纵本站点的文档。同源的文档必须有相同的协议,主机名和端口号。

eg:http://www.aaa.com/index.html 可以嵌入 http://www.aaa.com/index.js,因为他们同源。 而http://www.aaa.com 上的文档不能嵌入http://www.bbb.com,因为他们不同源。 这样虽然很安全,但是其他服务访问内容就会产生麻烦,所以就有了跨域资源共享技术 CORS。给其他非同源应用配置白名单(域名授权)的方式,来响应请求。

会话劫持( Session Hijacking )

我们知道HTTP本身是无状态的。我们做会话保持的一种方式是服务器发送一个会话session id,浏览器可以在Cookies中存储这个id,并在下次会话中协带这个id

这就会带来一个问题,如果一个攻击者拿到了这个会话id,那么它就能轻松访问这个web应用了。

  • 会话劫持的应对策略
    • 重置会话:每次会话服务器会验证旧的id,并签发新的id。在下一个请求中,id改变攻击者就无法访问这个会话了。

    • 设置会话过期时间:比如2小时,这样一来攻击者只能在有限的时间内访问这个web应用,过期就失效了。

    • 使用https可以有效降低攻击者获取id的可能性。可以参考我前面写的文章HTTPS认证原理

跨站脚本攻击 (XSS)
  • 一个例子 有个xx论坛,用户可以对帖子进行评论,而且评论信息会显示在当前帖子的评论列表里。 用户a评论了
<script>alert("hello world")</script>

那每次打开这个帖子就都会有弹窗了。

Snipaste_2021-12-08_18-08-31.png 如果评论信息是html和css相关,就会影响帖子的内容和布局了。

  • 跨站脚本攻击的应对策略
    • 无害处理:消除输入的问题,比如处理输入的html的相关标签,或者使用Markdown等的富文本编辑器。
    • 转义输入数据:转义用户输入的htmljavascript数据,这样浏览器就不会把他们当做代码执行了。