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)
上一篇 2022年5月19日 上午11:00
下一篇 2022年5月19日 上午11:00


相关推荐

  • django模型数据类型_多属性决策模型

    django模型数据类型_多属性决策模型模型中常用字段字段说明AutoField一般不需要使用这个类型,自增长类型,数据表的字段类型为整数,长度为11位BigAutoField自增长类型,数据表的字段类型为bigint,长度为2

    2022年7月29日
    12
  • Linux keypad 设备树,matrix_keypad 矩阵按键驱动分析

    Linux keypad 设备树,matrix_keypad 矩阵按键驱动分析matrix_keypad矩阵按键驱动分析//主要函数调用过程matrix_keypad_probematrix_keypad_parse_dt//根据设备树构造pdatapdata->num_row_gpios=nrow=of_gpio_named_count(np,”row-gpios”);pdata->num_col_gpios=ncol=of_gpio_…

    2022年6月12日
    98
  • 用PyTorch实现MNIST手写数字识别(非常详细)「建议收藏」

    hello大家好!我又来搬文章了!我就不信还有比这更详细的?!MNIST可以说是机器学习入门的helloword了!导师一般第一个就让你研究MNIST,研究透了,也算基本入门了。好的,今天就来扯一扯学一学。在本文中,我们将在PyTorch中构建一个简单的卷积神经网络,并使用MNIST数据集训练它识别手写数字。在MNIST数据集上训练分类器可以看作是…

    2022年4月5日
    53
  • 王维诗集

    王维诗集nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 华岳西岳出浮云 积雪 一作翠 在太清 连天凝 一作疑 黛色 百里遥青冥 白日为之 一作大 寒 森沈华阴城 昔闻乾坤闭 一作开 造 一作变 化生巨灵 右足踏方止 一作山 左手推削成 天地忽开拆 大河注东溟 遂为西峙岳 一作岳崎 雄雄镇秦京 大君包覆载 至德被群生 上帝伫昭告 金天思奉迎 人 一作神 祗望幸久 何独禅云亭 同庐拾遗过韦

    2026年3月19日
    3
  • cookie mapping「建议收藏」

    cookie mapping「建议收藏」CookieMapping的映射工作可以在SSP方进行,SSP方根据用户的Cookie信息,映射发送竞价请求中的DSP方Cookie,DSP方在竞价请求消息中获取自己的Cook

    2022年7月1日
    28
  • git clone几种可选参数的使用与区别[通俗易懂]

    git clone几种可选参数的使用与区别[通俗易懂]背景githubclone代码的速度,依赖于代码库的大小以及clone速度,基本是几十kb到200kb之间。要是能达到400kb,恭喜你;要是只有十几kb,emmmm,还是先去吃饭吧。这里以MOOC为例说明在clone某个git仓库时候需要注意的几个问题。全克隆单一克隆深度克隆全克隆很好理解,gitclonegit_仓库_url。存在一个问题,当clone…

    2022年7月21日
    33

发表回复

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

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