CORS与CSRF

本文首发于我的Github博客
本篇文章介绍了CORS和CSRF的概念(作者前几天在和带佬们聊天的时候把两个概念搞混了,所以才想要了解),简单来说:

  • CORS(Cross Origin Resource Sharing)跨域资源分享 是一种机制,通过在HTTP响应头中加入特定字段限制不同域的资源请求
  • CSRF(Cross Site Request Forgery)跨站请求伪造 是一种web攻击手段,通过向服务器发送伪造请求,进行恶意行为的攻击手段

CORS(Cross Origin Resource Sharing)跨域资源分享

什么是域与跨域

在讨论跨域之前,我们需要知道是什么

域是(scheme, host, port)三元组,也就是协议+主机+端口

只要上述三者中有任何一个不同,就说是两个不同的域

在web app中,经常会有一个站点请求另一个站点的资源的情况,比如

  • 前端App运行在localhost:3000
  • 后端App运行在localhost:8080
  • 前端调用axios向后端发起API请求,也就是localhost:3000localhost:8080的请求
  • 这样的请求就是跨域请求

CORS(跨域资源分享)的目的和实现思想

因为服务器方不希望随便一个什么域都能够想自己发送请求,或者通过请求获取资源,所以想出了CORS机制进行限制

首先我们细数一下一个web app进行请求的过程:

  • app发起请求
  • 浏览器收到app发起的请求,将真正的网络请求发到另外的站点上
  • 浏览器收到站点的响应
  • 浏览器将响应交给app处理

CORS的实现思想就是在请求过程中做手脚,达到限制站点发送请求或者接受响应的目的

CORS对于普通HTTP请求的修改

所谓普通HTTP请求,就是指GET这种请求

HTTP协议认为GET应该只会从服务器获取资源,不会对服务器本身数据做出改变,所以基本上是安全的

原先请求的流程被修改为:

  • app发起请求
  • 浏览器收到app发起的请求,将真正的网络请求发到另外的站点上
  • 浏览器收到站点的响应
  • 浏览器检查响应头是否允许当前域执行GET请求
    • 如不允许,就报错并丢弃数据
    • 如果允许,浏览器将响应交给app处理

所以浏览器是在执行请求之后进行了检查和限制

CORS对于preflight请求的修改

preflight请求,指的是POST这种会对服务器本身数据做出改变的请求,很可能会造成严重恶意后果

原先请求的流程修改为:

  • app发起请求
  • 浏览器收到app发起的请求(比如POST),先发送一个正常请求(OPTIONS请求)到目标站点上
  • 收到响应后,检查响应头是否允许当前站点向目标站点发起POST请求,
    • 如果允许,将真正的网络请求发到另外的站点上
      • 浏览器收到站点的响应
      • 浏览器将数据交给app处理
    • 如果不允许,直接报错

所以浏览器是在执行请求之前进行了检查和限制

CSRF(Cross Site Request Forgery)跨站请求伪造

CSRF是一种攻击手段,CORS的一个重要作用就是防范CSRF

由于我们的浏览器只是个发送请求的代发工具人,所以服务器收到请求时,并不能知道请求是如何被制造出来的

那么可以有这样的场景:

  • 我要上www.aabbcc.com网站
  • 结果点到了www.aabbccc.com网站
  • 我输入了www.aabbcc.com的用户名和密码
  • www.aabbccc.com利用我输入的用户名密码向www.aabbcc.com的服务器地址(假设为123.123.123.123:3000)发送恶意请求

这样就是www.aabbccc.com伪造了www.aabbcc.com的请求,并发送了,这就是CSRF(跨站请求伪造)

但是如果我们有CORS,在123.123.123.123:3000的响应头中指出只有www.aabbcc.com可以发送请求过来,那么www.aabbccc.com发送的请求就会被CORS和浏览器协作清除掉,www.aabbccc.com也就无法恶意攻击了

 

一、CORS 和 CSRF 区别

两者概念完全不同,另外常常我们也会看到 XSS ,这里一起介绍:

  • CORS : Cross Origin Resourse-Sharing 跨站资源共享

  • CSRF : Cross-Site Request Forgery 跨站请求伪造

  • XSS : Cross Site Scrit 跨站脚本攻击(为与 CSS 区别,所以在安全领域叫 XSS)

二、CORS

1、概念

跨来源资源共享(CORS),亦译为跨域资源共享,是一份浏览器技术的规范,提供了 Web服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,是 JSONP 模式的现代版。与 JSONP 不同,CORS 除了 GET请求方法以外也支持其他的 HTTP 请求。用 CORS 可以让网页设计师用一般的 XMLHttpRequest,这种方式的错误处理比JSONP 要来的好。另一方面,JSONP 可以在不支持 CORS 的老旧浏览器上运作。现代的浏览器都支持 CORS。

—— 维基百科

核心知识: CORS是一个W3C标准,它允许浏览器向跨源服务器,发出XMLHttpRequest 请求,从而克服 AJAX 只能同源使用的限制。

因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信,即为了解决跨域问题。

2、CORS 请求类型

浏览器将 CORS 请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

简单请求一般包括下面两种情况:
在这里插入图片描述

凡是不同时满足上面两个条件,就属于非简单请求。

三、CSRF

1、概念
  1. 概念

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 sessionriding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

—— 维基百科

核心知识: 跨站点请求伪造请求。

简单理解: 攻击者盗用你的身份,以你的名义发送恶意请求。

常见场景:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等等。

造成影响:个人隐私泄露以及财产安全。

2、CSRF 攻击流程

在这里插入图片描述
上面描述了 CSRF 攻击的流程,其中受害者完成两个步骤:

登录受信任网站 A ,并在本地生成保存Cookie;

在不登出 A 情况下,访问病毒网站 B;

可以理解为:若以上两个步骤没有都完成,则不会受到 CSRF 攻击。

四、XSS

1、概念

 

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

—— 维基百科

XSS 攻击,一般是指攻击者通过在网页中注入恶意脚本,当用户浏览网页时,恶意脚本执行,控制用户浏览器行为的一种攻击方式。

常见 XSS 危害有:

  • 窃取用户Cookie,获取用户隐私,盗取用户账号。

  • 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等。

  • 强制弹出广告页面,刷流量,传播跨站脚本蠕虫,网页挂马等。

  • 结合其他漏洞,如 CSRF 漏洞,实施进一步的攻击。

2、XSS的分类

在这里插入图片描述

posted @ 2024-02-21 11:54  CharyGao  阅读(333)  评论(0)    收藏  举报