beego——XSRF过滤
跨站请求伪造,简称XSRF,是Web应用中常见的一个安全问题。
当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的token数据,
然后要求所有提交的请求(POST/PUT/DELETE)中都必须带有这个token数据。如果此数据不匹配 ,那么这个请求就可能是被伪造的
关于XSRF攻击的详细内容可以参考博客:https://www.cnblogs.com/yangmingxianshen/p/8416843.html
beego有内建的XSRF的防范机制,要使用此机制,你需要在应用配置文件中加上enablexsrf设定:
enablexsrf = true
xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o
xsrfexpire = 3600
或者直接在main入口处这样设置:
beego.EnableXSRF = true
beego.XSRFKEY = "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o"
beego.XSRFExpire = 3600 //过期时间,默认1小时
如果开启了XSRF,那么beego的Web应用将所有用户设置一个_xsrf的token值(默认过期1小时)。
如果POST PUT DELETE请求中没有这个token值,那么这个请求会被直接拒绝。
如果你开启了这个机制,那么在所有被提交的表单中,你都需要加上一个域来提供这个值。你可以通过在模板中使用专门的函数XSRFFormHTML() 来做到这一点。
过期时间上面我们设置了全局的过期时间beego.XSRFExpire,但是有些时候我们也可以在控制器中修改这个过期时间,专门对某一类处理逻辑:
func (this *HomeController) Get(){
this.XSRFExpire = 7200
this.Data["xsrfdata"]=template.HTML(this.XSRFFormHTML())
}
在表单中使用
在Controller中这样设置数据:
func (this *HomeController) Get(){
this.Data["xsrfdata"]=template.HTML(this.XSRFFormHTML())
}
然后再模板中这样设置:
<form action="/new_message" method="post">
{{ .xsrfdata }}
<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/
jQuery.postJSON = function(url, args, callback) {
var xsrf, xsrflist;
xsrf = $.cookie("_xsrf");
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值。
func (this *HomeController) Get(){
this.Data["xsrf_token"] = this.XSRFToken()
}
放在你的head中:
<head>
<meta name="_xsrf" content="{{.xsrf_token}}" />
</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级别设置屏蔽:
type AdminController struct{
beego.Controller
}
func (a *AdminController) Prepare() {
a.EnableXSRF = false
}
beego——XSRF过滤的更多相关文章
- Beego源码分析(转)
摘要 beego 是 @astaxie 开发的重量级Go语言Web框架.它有标准的MVC模式,完善的功能模块,和优异的调试和开发模式等特点.并且beego在国内企业用户较多,社区发达和Q群,文档齐全, ...
- beego项目运行过程
一:首先man.go,整个程序的入口 func main() { beego.Run() } 然后beego.run()代码 // Run beego application. // beego.Ru ...
- beego学习笔记(4):开发文档阅读(6)
beego的响应流程: 1.监听的端口接收数据,默认是8080端口. 2.用户请求到达8080端口后,开始数据处理流程. 3.初始化CONTEXT对象.判断是否是WEBSOCKET请求,如果是,设置I ...
- beego 0.9.0 中智能路由AutoRouter的使用方法及源码解读
了解beego的开发者肯定知道,beego的路由设计来源于sinatra,原来是不支持自动路由的,每一个路由都要自己配置的,如: type MainController struct { beego. ...
- Tornado(cookie、XSRF、用户验证)
--------------------Cookie操作-------------------- 1.设置Cookie 1.set_cookie(name,value,domain=Non ...
- 用beego开发服务端应用
用beego开发服务端应用 说明 Quick Start 安装 创建应用 编译运行 打包发布 代码生成 开发文档 目录结构说明 使用配置文件 beego默认参数 路由设置 路由的表述方式 直接设置路由 ...
- ASP.NET MVC CSRF (XSRF) security
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- XSS/XSRF
一.XSS 1.1 xss的含义 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 ...
- Beego学习笔记
Beego学习笔记 Go 路由(Controller) 路由就是根据用户的请求找到需要执行的函数或者controller. Get /v1/shop/nike ShopController Get D ...
随机推荐
- 在OrangePI上搭建homeassitant过程记录
1.更换Python版本 由于在新版的homeassistant当中需要使用python3.5.3及以后的版本,但由于apt源中只包含3.5.2的版本,所以需要升级到python3.6. 具体更换方式 ...
- poj2391 Ombrophobic Bovines 拆点+二分法+最大流
/** 题目:poj2391 Ombrophobic Bovines 链接:http://poj.org/problem?id=2391 题意:有n块区域,第i块区域有ai头奶牛,以及一个可以容纳bi ...
- jquery怎么实现页面刷新后保留鼠标点击addclass的样式
$(document).ready(function(){ $('#rating li').each(function(){ if($($(this)).attr('id')==String(wind ...
- maven项目打ZIP包
1.Maven插件配置: <!-- ZIP打包 --> <plugin> <artifactId>maven-assembly-plugin</artifac ...
- QT creator 编辑多个UI 文件 出现 无法解析的外部符号的错误
创建一般的Qt Gui 程序一般会默认一个UI 文件 ,但是随着应用程序窗口的增多,同时编辑多个UI 界面是必须的. 假设我们已经创建好了一个QTUI的工程,里面已经默认了一个UI文件,但是想在添几个 ...
- gibhub上搭建个人静态网站介绍
之前学习过git的基本命令.今天介绍一下github上搭建个人网站的步骤. 在window系统上搭建gibhub个人网站(只能执行html.css和js文件),这就是纯静态页面. 步骤一:注册gith ...
- js 风格(注意事项)
类型 • 原始类型:我们可以直接使用值. ο string ο number ο boolean ο null ο undefined var foo = 1, bar = foo; bar = ...
- 使用JMX监控Kafka
监控数据源 JMX RMI方式启动Broker,Consumer,Producer -ea -Dcom.sun.management.jmxremote.authenticate=false -Dco ...
- memcache的内存管理机制
Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题Memcache的存储涉及到slab,page,chunk三 ...
- iOS Search bar 输入空字符串也可以搜索
Search bar delegate - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { UITextField *sea ...