beego——XSRF过滤

beego——XSRF过滤跨站请求伪造,简称XSRF,是Web应用中常见的一个安全问题。当前防范XSRF的一种通用的方法,是对每一个用户都记录一个无法预知的token数据,然后要求所有提交的请求(POST/PUT/DELETE)中都必须带有这个token数据。如果此数据不匹配,那么这个请求就可能是被伪造的关于XSRF攻击的详细内容可以参考博客:https://www.cnblogs.com/yangmin…

大家好,又见面了,我是你们的朋友全栈君。

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

  

 

转载于:https://www.cnblogs.com/yangmingxianshen/p/10121449.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144547.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python—最大公约数和最小公倍数

    python—最大公约数和最小公倍数最大公约数defhcf(x,y): ifx<=0ory<=0: return res=0 ifx>y: small=y else: small=x foriinrange(1,small+1): ifx%i==0andy%i==0: res=iif__name__==’__main__’: print(hcf(12,24)) #内置模块importmathmath.

    2022年5月16日
  • 一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 责编:乐乐 链接:oschina.net/news/112586/kk-anti-reptile-released …

    2021年6月24日
  • pycharm的配置_pycharm添加编译器

    pycharm的配置_pycharm添加编译器一、Pycharm简介与安装简介Pycharm与VScode一样,都可以作为python的可视化IDE,功能很强大,可以帮助我们提高编程的效率。包括调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。安装作为一个穷孩子,建议还是安装社区免费版,因为社区免费版与专业版无差别,功能是齐全的。安装地址在这里!二、Pycharm配置作为python编程的ID…

    2022年8月28日
  • python的赋值功能很强大_python中赋值

    python的赋值功能很强大_python中赋值前言增强型赋值语句是经常被使用到的,因为从各种学习渠道中,我们能够得知i+=1的效率往往要比i=i+1更高一些(这里以+=为例,实际上增强型赋值语句不仅限于此)。所以我们会乐此不

    2022年8月7日
  • 优秀的程序员真的不写注释吗?

    优秀的程序员真的不写注释吗?我在很多地方看到这样一个观点,“请停止写注释,因为只有烂的代码才需要注释。”这个观点非常巧妙,它让我想起了孟子的一句话,“杨氏为我,是无君也;墨氏兼爱,是无父也。无父无君,是禽兽也。”动不动就骂别人是“禽兽”,我总觉得有点不妥,这很不符合孟子的浩然之气啊。有些大牛也有孟子这样的觉悟,如果有人要他给自己的代码加上注释,就好像是对他的一种侮辱:“我的代码写得这么优雅,你难道看不懂吗?注释是多余的!”我必须得承认,每个程序员都应该有一颗追求“优雅”的心,力争自己的代码更易阅读和理解——不只是针对机器,还有我

    2022年5月30日
  • springmvc 适配器详解[通俗易懂]

    springmvc 适配器详解[通俗易懂]大家知道springmvc是一个非常优良的框架,配置灵活实现简单,只需我们更多的关注我们的业务逻辑。今天我们就通过一个简单的例子模拟适配生成过程。处理器适配器HandlerAdapter1、SimpleControllerHandlerAdapter表示所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean可以作

    2022年5月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号