导读

  介绍CRSF(Cross-site request forgery)&CORS(Cross-origin resource sharing)之前,我们先介绍下HTTP,若读者对HTTP较熟悉,可以直接跳过此内容。

HTTP请求

  一个HTTP请求包括:请求行(request line)、请求头(header)、空行 和 请求体 四个部分组成。

1
2
3
4
5
6
7
GET /mix/76.html?name=kelvin&password=123456 HTTP/1.1
Host: www.fishbay.cn
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
  • 请求行:GET为请求类型,/mix/76.html?name=kelvin&password=123456为要访问的资源,HTTP/1.1是协议版本
  • 请求头:Host指出请求的目的地(主机域名);User-Agent是客户端的信息,它是检测浏览器类型的重要信息,由浏览器定义,并且在每个请求中自动发送。Accept-Encoding能够支持的内容编码及内容编码的优先级顺序。Accept-Language能够接受处理的自然语言集(指中文或者英文等)
  • 请求体:可以添加任意的其它数据。(GET方法没有请求体)
HTTP 请求方法:
  • GET 请求指定的页面信息,并返回实体主体。
  • HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
  • POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT 从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE 请求服务器删除指定的页面。
  • TRACE 回显服务器收到的请求,主要用于测试或诊断。
  • OPTIONS 向用户显示可用于特定URL的HTTP方法。
  • CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  • PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新。

HTTP响应

  一个HTTP响应也由四个部分组成,分别是:响应行、响应头、空行和响应体。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Feb 2017 09:13:59 GMT
Content-Type: text/plain;charset=UTF-8
Vary: Accept-Encoding
Cache-Control: no-store
Pragrma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-Connection: Keep-alive

{"code":200,"notice":0,"follow":0,"forward":0,"msg":0,"comment":0,"pushMsg":null,"friend":{"snsCount":0,"count":0,"celebrityCount":0},"lastPrivateMsg":null,"event":0,"newProgramCount":0,"createDJRadioCount":0,"newTheme":true}
  • 响应行:响应行由协议版本号、状态码、状态消息组成
  • 响应头:客户端可以使用的一些信息,如:Date(生成响应的日期)、Content-Type(MIME类型及编码格式)、Connection(默认是长连接)、Vary字段主要用于代理服务器实现缓存服务(记录了代理服务器返回特定数据参考了哪些请求字段,代理服务器拿到源服务器的响应报文,会根据Vary里的字段列表,缓存不同版本的数据)…
  • 空行:响应头和响应体之间必须有一个空行
  • 响应体:响应正文,本例中是键值对信息

CSRF

https://portswigger.net/web-security/csrf

CORS

https://portswigger.net/web-security/cors