您的位置:MYSQL中文网 > csrf攻击防御 GoFrame 高级特性-CSRF防御设置

csrf攻击防御 GoFrame 高级特性-CSRF防御设置

2023-04-28 21:30 GoFrame教程

csrf攻击防御 GoFrame 高级特性-CSRF防御设置

csrf攻击防御

CSRF(Cross-site request forgery)攻击是一种恶意攻击,它利用了用户的身份验证信息来执行未经授权的操作。它可以通过在受害者的浏览器中注入恶意代码来实施,这些代码会在受害者不知情的情况下向服务器发送请求。

CSRF 攻击防御主要是通过使用验证令牌来实现的。验证令牌是一个随机生成的字符串,由服务器生成并存储在会话中。当用户发送一个请求时,服务器会验证令牌是否正确,如果不正确则会拒绝请求。

// 在表单中加入隐藏字段 csrf_token 
<form action="..." method="post"> 
    <input type="hidden" name="csrf_token" value="{{ csrf_token }}"> 
    ... 
</form> 
// 在服务端校验 csrf_token 是否正确 
if (request.method == 'POST') { 
    if (request.POST['csrf_token'] != session['csrf_token']) { 
        // 非法请求, 拒绝处理 
        return false; 
    } else { 
        // 处理正常的 POST 请求 

    } 
}   

GoFrame 高级特性-CSRF防御设置

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

如何防御

这里我们选择通过​token​的方式对请求进行校验,通过中间件的方式实现,​CSRF​跨站点防御插件由社区包提供。

开发者可以通过对接口添加中间件的方式,增加​token​校验功能。

感兴趣的朋友可以阅读插件源码 https://github.com/gogf/csrf

使用方式

引入插件包

import "github.com/gogf/csrf"

配置接口中间件

csrf​插件支持自定义​csrf.Config​配置,​Config​中的​Cookie.Name​是中间件设置到请求返回​Cookie​中​token​的名称,​ExpireTime​是​token​超时时间,​TokenLength​是​token​长度,​TokenRequestKey​是后续请求需求带上的参数名。

s := g.Server()
s.Group("/api.v2", func(group *ghttp.RouterGroup) {
	group.Middleware(csrf.NewWithCfg(csrf.Config{
		Cookie: &http.Cookie{
			Name: "_csrf",// token name in cookie
		},
		ExpireTime:      time.Hour * 24,
		TokenLength:     32,
		TokenRequestKey: "X-Token",// use this key to read token in request param
	}))
	group.ALL("/csrf", func(r *ghttp.Request) {
		r.Response.Writeln(r.Method + ": " + r.RequestURI)
	})
})

前端对接

通过配置后,前端在​POST​请求前从​Cookie​中读取​_csrf​的值(即​token​),然后请求发出时将​token​以​X-Token​(​TokenRequestKey​所设置)参数名置入请求中(可以是​Header​或者​Form​)即可通过​token​校验。

代码示例

使用默认配置

package main

import (
	"net/http"
	"time"

	"github.com/gogf/csrf"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

// default cfg
func main() {
	s := g.Server()
	s.Group("/api.v2", func(group *ghttp.RouterGroup) {
		group.Middleware(csrf.New())
		group.ALL("/csrf", func(r *ghttp.Request) {
			r.Response.Writeln(r.Method + ": " + r.RequestURI)
		})
	})
	s.SetPort(8199)
	s.Run()
}

使用自定义配置

package main

import (
	"net/http"
	"time"

	"github.com/gogf/csrf"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

// set cfg
func main() {
	s := g.Server()
	s.Group("/api.v2", func(group *ghttp.RouterGroup) {
		group.Middleware(csrf.NewWithCfg(csrf.Config{
			Cookie: &http.Cookie{
				Name: "_csrf",// token name in cookie
				Secure:   true,
				SameSite: http.SameSiteNoneMode,// 自定义samesite    
			},
			ExpireTime:      time.Hour * 24,
			TokenLength:     32,
			TokenRequestKey: "X-Token",// use this key to read token in request param
		}))
		group.ALL("/csrf", func(r *ghttp.Request) {
			r.Response.Writeln(r.Method + ": " + r.RequestURI)
		})
	})
	s.SetPort(8199)
	s.Run()
}


阅读全文
以上是MYSQL中文网为你收集整理的csrf攻击防御 GoFrame 高级特性-CSRF防御设置全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 MYSQL中文网 mysqlcn.com 版权所有 联系我们
桂ICP备12005667号-29 Powered by CMS