HTTP中的跨域请求、HTTP报文结构、状态码

目录

一、前驱知识学习

(1)请求报文

(2)响应报文

二、HTTP中的跨域请求

1. 什么是跨域请求

2.什么是同源策略

3.为什么要设置这种限制

3.1 攻击实例

3.2 攻击原理

4. 怎样取消这种跨域的限制?—— CORS(跨资源共享- Cross-origin resource sharing)


对这篇博客的理解及记录:HTTP跨域的原因及解决方法(CORS 和 JSONP) - 简书

一、前驱知识学习

要理解跨域请求的话,需要对HTTP的报文结构、状态码有所了解。

HTTP 有两类报文:

(1)请求报文——从客户向服务器发送请求报文。

(2)响应报文——从服务器到客户的回答。

(1)请求报文

HTTP中的跨域请求、HTTP报文结构、状态码_第1张图片

命令/方法:常见的有GET、POST、HEAD

HTTP中的跨域请求、HTTP报文结构、状态码_第2张图片

(2)响应报文

HTTP中的跨域请求、HTTP报文结构、状态码_第3张图片

状态码:

(1)状态码都是三位数字

1xx 表示通知信息的,如请求收到了或正在进行处理。

2xx 表示成功,如接受或知道了。

3xx 表示重定向,表示要完成请求还必须采取进一步的行动。

4xx 表示客户的差错,如请求中有错误的语法或不能完成。

5xx 表示服务器的差错,如服务器失效无法完成请求。

(2)常见状态码
200 - 请求成功
301 - 资源(网页等)被永久转移到其他URL
404 - 请求的资源(网页等)不存在
405 - 客户端请求中的方法被禁止
500 - 内部服务器错误

二、HTTP中的跨域请求

1. 什么是跨域请求

访问不同源的资源就是跨域请求。那什么是源?一个源可以看做一个URL=协议+域名+端口。那么同源就是相同协议相同域名相同端口。三者只要一个不满足,就是不同源

2.什么是同源策略

访问同源的资源是被浏览器允许的,但是如果访问不同源的资源,浏览器默认不允许。

3.为什么要设置这种限制

这是浏览器为了保户用户安全而制造的策略。假如没有这层保护,网站就很容易受到跨站伪造请求(CSRF)的攻击。

Web漏洞之CSRF(跨站请求伪造漏洞)详解 - 知乎

防止这种威胁的思路是:不允许用户访问了一个网站以后,在这个网站里访问另一个网站。这就保证了进入一个合法的网站后,浏览的资源都是这个网站提供的,也都是合法的,没有危险。

网站的负责人才能保证说,“你进入我这个网站,在网站里用你的鼠标随便点击,都是没有问题的”。

3.1 攻击实例

下面给出攻击的实例,重点体会是怎样利用“跨域”的。

(1)GET攻击

如果一个网站中修改邮箱功能是通过GET请求进行修改的。如:/[email protected] ,这个链接的意思是用户id=1将邮箱修改为[email protected]。当我们把这个链接修改为 /[email protected] ,然后通过各种手段发送给被攻击者,诱使被攻击者点击我们的链接,当用户刚好在访问这个网站,他同时又点击了这个链接(跨域),那么悲剧发生了。这个用户的邮箱被修改为 [email protected] 了。

(2)POST攻击

你作为用户登录了某电影网站,点击网页->打开试看视频->购买视频是一个很正常的一个流程。在你点击购买页面时,攻击者可以抓到网站处理购买(扣除)用户余额的地址。比如:/coures/user/handler/25332/buy.php 。通过提交表单,buy.php处理购买的信息,这里的25532为视频ID。那么攻击者现在构造一个链接,链接中包含以下内容

当用户访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作,自动购买了id为25332的视频,从而导致被攻击者余额扣除。 

3.2 攻击原理

HTTP中的跨域请求、HTTP报文结构、状态码_第4张图片

  1. 用户输入账号信息请求登录A网站。
  2. A网站验证用户信息,通过验证后返回给用户一个cookie
  3. 在未退出网站A之前,在同一浏览器中请求了黑客构造的恶意网站B
  4. B网站收到用户请求后返回攻击性代码,构造访问A网站的语句
  5. 浏览器收到攻击性代码后,在用户不知情的情况下携带cookie信息请求了A网站。此时A网站不知道这是由B发起的。那么这时黑客就可以进行一下骚操作了!

两个条件同时满足:

a 用户访问站点A并产生了cookie

b 用户没有退出A同时访问了B

4. 怎样取消这种跨域的限制?—— CORS(跨资源共享- Cross-origin resource sharing)

在开发的过程中,有的时候是需要进行跨域访问的。那么怎样取消这种浏览器默认的限制呢?

服务器端:允许使用CORS。以elasticsearch这个服务为例,在elasticsearch.yml这个配置文件中,设置允许cors。

http.cors.enabled: true         # 允许跨域访问
http.cors.allow-origin: "*"     # “*”表示所有域名

浏览器端

(1)对于简单请求

浏览器直接发出CORS请求。在HTTP头部中自动添加一个Origin字段(本次请求来自哪个源:协议+域名+端口),服务器根据这个值,决定是否同意这次请求。

(2)对于非简单请求

非简单请求之前,会增加一次HTTP查询请求,称为“预检”请求。

服务器通过"预检"请求之后,以后每次浏览器CORS请求都和简单请求一样

你可能感兴趣的:(http,前端,网络协议)