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

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)请求报文

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

(2)响应报文

状态码:

(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请求进行修改的。如:/user.php?id=1&email=123@163.com ,这个链接的意思是用户id=1将邮箱修改为123@163.com。当我们把这个链接修改为 /user.php?id=1&email=abc@163.com ,然后通过各种手段发送给被攻击者,诱使被攻击者点击我们的链接,当用户刚好在访问这个网站,他同时又点击了这个链接(跨域),那么悲剧发生了。这个用户的邮箱被修改为 abc@163.com 了。

(2)POST攻击

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

<form action=/coures/user/handler/25332/buy method=POST>
<input type="text" name="xx" value="xx" />
</form>
<script> document.forms[0].submit(); </script> 

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

3.2 攻击原理

  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中的跨域请求HTTP报文结构状态码的主要内容,如果未能解决你的问题,请参考以下文章

HTTP响应报文结构

HTTP协议,Http 常用状态码

http状态码相关知识(复制)

AngularJS 中的跨域 HTTP 请求失败

HTTP 报文 之 HTTP 状态码

前端基础之网络