beego——XSRF过滤
跨站请求伪造,简称XSRF,是Web应用中常见的一个安全问题。
当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的token数据,
然后要求所有提交的请求(POST/PUT/DELETE)中都必须带有这个token数据。如果此数据不匹配 ,那么这个请求就可能是被伪造的
关于XSRF攻击的详细内容可以参考博客:https://www.cnblogs.com/yangmingxianshen/p/8416843.html
beego有内建的XSRF的防范机制,要使用此机制,你需要在应用配置文件中加上enablexsrf设定:
1 2 3 | enablexsrf = true xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o xsrfexpire = 3600 |
或者直接在main入口处这样设置:
1 2 3 | beego.EnableXSRF = true beego.XSRFKEY = "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o" beego.XSRFExpire = 3600 //过期时间,默认1小时 |
如果开启了XSRF,那么beego的Web应用将所有用户设置一个_xsrf的token值(默认过期1小时)。
如果POST PUT DELETE请求中没有这个token值,那么这个请求会被直接拒绝。
如果你开启了这个机制,那么在所有被提交的表单中,你都需要加上一个域来提供这个值。你可以通过在模板中使用专门的函数XSRFFormHTML()
来做到这一点。
过期时间上面我们设置了全局的过期时间beego.XSRFExpire,但是有些时候我们也可以在控制器中修改这个过期时间,专门对某一类处理逻辑:
1 2 3 4 | func (this *HomeController) Get(){ this.XSRFExpire = 7200 this.Data[ "xsrfdata" ]=template.HTML(this.XSRFFormHTML()) } |
在表单中使用
在Controller中这样设置数据:
1 2 3 | func (this *HomeController) Get(){ <strong>this.Data[ "xsrfdata" ]=template.HTML(this.XSRFFormHTML())</strong> } |
然后再模板中这样设置:
1 2 3 4 5 | <form action= "/new_message" method= "post" > <strong>{{ .xsrfdata }}</strong> <input type = "text" name= "message" /> <input type = "submit" value= "Post" /> </form> |
在JS中使用:
如果你提交的是AJAX的POST请求,你还是需要在每一个请求中通过脚本添加上_xsrf这个值。
下面是在AJAX的POST请求,使用jQuery函数来为所有的请求都添加_xsrf值:
jQuery cookie插件:https://github.com/carhartl/jquery-cookie
base64 插件:http://phpjs.org/functions/base64_decode/
1 2 3 4 5 6 7 8 9 10 | jQuery.postJSON = function(url, args, callback) { var xsrf, xsrflist; <strong> xsrf = $.cookie( "_xsrf" );</strong> xsrflist = xsrf.split( "|" ); args._xsrf = base64_decode(xsrflist[0]); $.ajax({url: url, data: $.param(args), dataType: "text" , type : "POST" , success: function(response) { callback(eval( "(" + response + ")" )); }}); }; |
扩展jquery
通过扩展ajax给每个请求加入xsrf的header,需要在html中保存一个_xsrf值。
1 2 3 | func (this *HomeController) Get(){ <strong>this.Data[ "xsrf_token" ] = this.XSRFToken()</strong> } |
放在你的head中:
1 2 3 | <head> <meta name= "_xsrf" content= "<strong>{{.xsrf_token}}</strong>" /> </head> |
扩展ajax方法,将_xsrf值加入header,扩展后支持jquery post/get等内部使用了ajax的方法。
var ajax = $.ajax; $.extend({ ajax: function(url, options) { if (typeof url === 'object') { options = url; url = undefined; } options = options || {}; url = options.url; var xsrftoken = $('meta[name=_xsrf]').attr('content'); var headers = options.headers || {}; var domain = document.domain.replace(/\./ig, '\\.'); if (!/^(http:|https:).*/.test(url) || eval('/^(http:|https:)\\/\\/(.+\\.)*' + domain + '.*/').test(url)) { headers = $.extend(headers, {'X-Xsrftoken':xsrftoken}); } options.headers = headers; return ajax(url, options); } });
对于PUT和DELETE请求以及不使用将form内容作为参数的POST请求来说,你也可以在HTTP头中以X-XSRF Token这个参数传递XSRF token。
如果你需要针对每一个请求处理器定制XSRF行为,你可以重写Controller的CheckXSRFCookie方法。
例如你需要使用一个不支持cookie的API,你可以通过将CheckXSRFCookie()函数设空来禁用XSRF保护机制。
然而如果你需要同时支持cookie和非cookie认证方式,那么只要当前请求通过cookie进行认证的,你就应该对齐使用XSRF保护机制。
支持controller级别的屏蔽
XSRF之前是全局设置的一个参数,如果设置了那么所有的API请求都会进行验证,但是有些时候API逻辑是不需要进行验证的,因此现在支持在controller级别设置屏蔽:
1 2 3 4 5 6 7 | type AdminController struct { beego.Controller } func (a *AdminController) Prepare() { <strong>a.EnableXSRF = false</strong> } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2017-12-14 MySQL——并发控制(锁)
2017-12-14 MySQL——多版本并发控制
2017-12-14 MySQL——事务
2017-12-14 Redis的特性
2017-12-14 Docker与虚拟化