跨站请求伪造,简称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
}

  

最新文章

  1. spring-aop学习
  2. 『TCP/IP详解——卷一:协议』读书笔记——05
  3. 抢滩登陆游戏android源码
  4. 监听mysql是否挂了
  5. checkbox在jquery版本1.9 以上用attr不可重复操作的问题【附解决方案】
  6. iphone自定义铃声
  7. 02.[WPF]如何固定窗口的大小
  8. js千分位转换
  9. Cisco cmd命令(三)动态路由协议
  10. sqlite数据库读写在linux下的权限问题
  11. EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuicool
  12. PAT (Advanced Level) 1091. Acute Stroke (30)
  13. angular2 组件交互
  14. mysql常用基础操作语法(九)~~外连接查询【命令行模式】
  15. _C#发送邮箱
  16. 《Odoo开发指南》精选分享—第1章-开始使用Odoo开发(1)
  17. JavaScript 隐式类型转换
  18. 深入出不来nodejs源码-从fs.stat方法来看node架构
  19. 无责任Windows Azure SDK .NET开发入门(二):使用Azure AD 进行身份验证
  20. XenServer DVSC

热门文章

  1. git设置忽略文件和目录
  2. usb 安装系统
  3. 那些让人睡不着觉的bug,你有没有遭遇过?
  4. Visual Studio 2010自动添加头部注释信息
  5. XmLHttpRequst下载Excel
  6. 第5步:建立主机间的信任关系(sgdb1、sgdb2)
  7. tomcat报错-----》Unable to open debugger port IDEA Unable to open debugger port
  8. c++ wchar_t
  9. [HackerRank] The Longest Common Subsequence
  10. C++ primer记录