go开源宝藏cors跨域与csrf攻击|中间件(代码片段)

小生凡一 小生凡一     2023-01-15     412

关键词:

1. 什么是跨域

当一个请求url的协议域名端口三者之间任意一个与当前页面url不同即为跨域

当前页面url被请求页面url是否跨域原因
http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同(8080/7001)

因为域的不一致,与此同时由于安全问题,请求就会受到同源策略限制

通常,浏览器会对跨域请求作出限制。
浏览器之所以要对跨域请求作出限制,是出于安全方面的考虑,因为跨域请求有可能被不法分子利用来发动 CSRF攻击。

2. CSRF攻击

2.1 CSRF说明

CSRF(Cross-site request forgery)中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

2.1 原理

​ CSRF 攻击的原理大致描述如下:

  1. 有两个网站,其中A网站是真实受信任的网站,而B网站是危险网站。
  2. 在用户登陆了受信任的A网站是,本地会存储A网站相关的Cookie,并且浏览器也维护这一个Session会话。
  3. 这时,如果用户在没有登出A网站的情况下访问危险网站B,那么危险网站B就可以模拟发出一个对A网站的请求(跨域请求)对A网站进行操作
  4. 而在A网站的角度来看是并不知道请求是由B网站发出来的(Session和Cookie均为A网站的),这时便成功发动一次 CSRF 攻击。

​ 因而 CSRF 攻击可以简单理解为:攻击者盗用了你的身份,以你的名义发送请求

CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。

3. CORS

3.1 简介

跨源资源共享 Cross-Origin Resource Sharing(CORS) 是一个新的 W3C 标准,它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。

换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制

简单介绍一下CORS中新增的 HTTP 首部字段

  • Access-Control-Allow-Origin
    响应首部中可以携带这个头部表示服务器允许哪些域可以访问该资源
c.Header("Access-Control-Allow-Origin", "*")        
  • Access-Control-Allow-Methods
    预检请求的响应,指明实际请求所允许使用的HTTP方法
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")    
  • Access-Control-Allow-Headers
    首部字段用于预检请求的响应,指明了实际请求中允许携带的首部字段
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
  • Access-Control-Max-Age
    首部字段用于预检请求的响应,指定了预检请求能够被缓存多久。
c.Header("Access-Control-Max-Age", "172800")  
  • Access-Control-Allow-Credentials
    首部字段用于预检请求的响应,指明实际请求所允许使用的HTTP方法。
c.Header("Access-Control-Allow-Credentials", "false")       

3.2 引用

在中间件中设置编写即可!

func Cors() gin.HandlerFunc 
	return func(c *gin.Context) 
		method := c.Request.Method      	      //请求方法
		origin := c.Request.Header.Get("Origin")  //请求头部
		var headerKeys []string                   // 声明请求头keys
		for k := range c.Request.Header 
			headerKeys = append(headerKeys, k)
		
		headerStr := strings.Join(headerKeys, ", ")
		if headerStr != "" 
			headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
		 else 
			headerStr = "access-control-allow-origin, access-control-allow-headers"
		
		if origin != "" 
			c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
			c.Header("Access-Control-Allow-Origin", "*")        
			// 这是允许访问所有域
			c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")      
			//服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求
			//  header的类型
			c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
			// 允许跨域设置,可以返回其他子段                                                                                                		 
			c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar")      
			// 跨域关键设置 让浏览器可以解析
			c.Header("Access-Control-Max-Age", "172800")        
			// 缓存请求信息 单位为秒
			c.Header("Access-Control-Allow-Credentials", "false")       
			//  跨域请求是否需要带cookie信息 默认设置为true
			c.Set("content-type", "application/json")      
			// 设置返回格式是json
		
		//放行所有OPTIONS方法
		if method == "OPTIONS" 
			c.JSON(http.StatusOK, "Options Request!")
		
		c.Next()        //  处理请求
	

配合gin框架使用

	r:=gin.Default()
	r.Use(middleware.Cors())

参考文献
1、https://www.jianshu.com/p/f880878c1398
2、https://blog.csdn.net/qq_38128179/article/details/84956552

django解决csrf跨域问题(代码片段)

1、中间件代码[[email protected]mysite]#treemiddlewaresmiddlewares├──base.py├──base.pyc├──cors.py├──cors.pyc├──__init__.py└──__init__.pyc0directories,6files[[email protected]-node01mysite]#2.代码midd 查看详情

跨域post及使用token防止csrf攻击

环境:后台使用的python-flask前台使用angular框架1.一个跨域post的样例:跨域post有多种实现方式:1.CORS:http://blog.csdn.net/hfahe/article/details/77309442.利用iframe3.serverproxy:https://en.wikipedia.org/wiki/Proxy_server样例使用的为iframe,想要证 查看详情

go开源宝藏十分强大的日志库logrus(代码片段)

文章目录1.写在前面2.简单例子3.HOOKS4.嵌入中间件1.写在前面这次所介绍的库是一个日志库github.com/sirupsen/logrus,是我们在web开发中,经常需要的库,因为我们的应用部署到线上出现问题的话,就需要用日志来进行... 查看详情

go开源宝藏十分强大的日志库logrus(代码片段)

文章目录1.写在前面2.简单例子3.HOOKS4.嵌入中间件1.写在前面这次所介绍的库是一个日志库github.com/sirupsen/logrus,是我们在web开发中,经常需要的库,因为我们的应用部署到线上出现问题的话,就需要用日志来进行... 查看详情

为啥预检 CORS 不阻止 CSRF 攻击?

】为啥预检CORS不阻止CSRF攻击?【英文标题】:Whydoesn\'tpre-flightCORSblockCSRFattacks?为什么预检CORS不阻止CSRF攻击?【发布时间】:2017-04-3002:50:46【问题描述】:Everyone说CORS没有做任何事情来防御CSRF攻击。这是因为CORS会阻止域外访问... 查看详情

浅谈跨域劫持

本篇文章主要讲解一下跨域攻击:Jsonp劫持Flash跨域劫持CORS跨域资源获取Jsonp劫持Jsonp在2016年就出现了,由于造成危害大多就是泄露敏感信息,比如用户信息,token等,远不如SQL注入,命令执行这些漏洞来的彻底,所以总是被人忽... 查看详情

是否有可能在 CORS 之前进行 CSRF 攻击?

】是否有可能在CORS之前进行CSRF攻击?【英文标题】:WasitpossibletodoCSRFattacksbeforeCORS?【发布时间】:2019-01-1620:13:56【问题描述】:我查看了this堆栈溢出答案以了解CORS预检请求。根据这个答案,当CORS不存在时,可以进行CSRF攻击。... 查看详情

跨域与前后端分离(代码片段)

...e跨域postMessage跨域跨域资源共享(CORS)nginx代理跨域nodejs中间件代理跨域WebSocket协议跨域上面的方案我们只取第六点,第7点,第八点,【7和8是一样的】再看回axios篇里的这句代码baseURL:process.env.NODE_ENV==='development'?'/proxy... 查看详情

django解决跨域请求的问题(代码片段)

...2.配置settings.py文件INSTALLED_APPS=[...‘corsheaders‘,...]#添加中间件MIDDLEWARE=[‘django.middleware.security.SecurityMiddleware‘,#默认‘django.contrib.sessions.middleware.SessionMiddleware‘,#默认‘corsheaders.middleware.CorsMiddleware‘,#默认#注意顺序,即在上一... 查看详情

csrf攻击(跨域攻击)

一.CSRF是什么?CSRF(Cross-siterequestforgery),中文名称:跨站请求伪造,也被称为:oneclickattack/sessionriding,缩写为:CSRF/XSRF。二.CSRF可以做什么?你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF... 查看详情

CORS 和 CSRF 处理 checkMarx XSRF 攻击问题(spring boot 微服务)

】CORS和CSRF处理checkMarxXSRF攻击问题(springboot微服务)【英文标题】:CORSandCSRFtohandlecheckMarxXSRFattackissue(springbootmicroservice)【发布时间】:2021-10-1016:32:45【问题描述】:我正在处理一个有待处理checkmarx问题(最近从veracode迁移)的... 查看详情

为啥浏览器在通过来自不同域的发帖尝试 CSRF 攻击时不会引发 CORS 错误? [关闭]

】为啥浏览器在通过来自不同域的发帖尝试CSRF攻击时不会引发CORS错误?[关闭]【英文标题】:WhydoesthebrowsernotthrowaCORSerrorwhentryingoutCSRFattackbypostingthroughafromfromdifferentdomain?[closed]为什么浏览器在通过来自不同域的发帖尝试CSRF攻击... 查看详情

drf跨域问题(代码片段)

...加到INSTALL_APPS中INSTALLED_APPS=(...‘coreschema‘,...)三、添加中间件下面添加中间件的说明:CorsMiddleware shouldbeplacedashighaspossible,especiallybeforeanymiddlewarethatcangenerateresponsessuchasDjango‘s CommonMiddleware orWhitenoise‘s WhiteNoiseMiddl... 查看详情

springsecurity---跨域访问和跨站攻击问题详解(代码片段)

SpringSecurity---跨域访问问题详解什么是跨域访问跨域访问的解决方案有哪些?第一类方案:前端解决方案第二类方案:使用代理第三类方案:CORSCORS简述Spring-CORS规则基础配置SpringBoot下实现CORS的四种方式使用CorsFilt... 查看详情

同源策略的解决方案(代码片段)

...获取被攻击者的token信息进行一些转账操作。#什么是CORS跨域资源共享(CO 查看详情

解决跨域问题(代码片段)

...项目配置:dev.py#注册appINSTALLED_APPS=[...‘corsheaders‘]#添加中间件MIDDLEWARE=[...‘corsheaders.middleware.CorsMiddleware‘]#允许跨域源CORS_ORIGIN_ALLOW_ALL=True  查看详情

前端跨域(代码片段)

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。也就是说如果协议,域名,或者端口有一个不同就是跨域。那么为什么要用跨域?其实是因为浏览器出于安全考虑,我们都知道浏览器有同源策略。如果没有同源策... 查看详情

csrf跨站请求伪造与xss跨域脚本攻击讨论

今天和朋友讨论网站安全问题,聊到了csrf和xss,刚开始对两者不是神明白,经过查阅与讨论,整理了如下资料,与大家分享.CSRF(Cross-siterequestforgery):跨站请求伪造。从上图可以看出,要完成一次CSRF攻击,受害者必须满足两个必要的... 查看详情