当前位置: 首页 > 知识库问答 >
问题:

Grails-Ajax表单中是否有一种处理CSRF攻击的推荐方法?

楚浩然
2023-03-14

我将同步器令牌模式用于标准表单(useToken=true),但我找不到任何在Ajax上处理此问题的推荐方法。

编辑

自从发布了这篇文章之后,我已经推出了包含Grails现有模式的解决方案

在jQuery ajax中,我发布了整个表单(其中包括Grails注入的SYNCHRONIZER_TOKEN和SYNCHRONIZER_URI隐藏字段),以便withForm闭包可以在控制器中按预期执行。

问题是,在成功响应时,没有新的令牌设置(因为页面没有重新加载,也没有调用g:form taglib),所以我在控制器中手动执行此操作,调用到与g:form taglib相同的库中,并在ajax响应中返回它,然后重置隐藏字段值。见下文:

var formData = jQuery("form[name=userform]").serializeArray();

$.ajax({
    type: 'POST',
    url: 'delete',
    data: formData,
    success: function (data) {
        // do stuff
    },
    complete: function (data) {
        // Reset the token on complete
        $("#SYNCHRONIZER_TOKEN").val(data.newToken);
    }
})

在控制器中:

def delete(String selectedCommonName) {

    def messages = [:]
    withForm {
        User user = User.findByName(name)

        if (user) {
            userService.delete(user)
            messages.info = message(code: 'user.deleted.text')

        } else {
            messages.error = message(code: 'user.notdeleted.text')
        }
    }.invalidToken {
            messages.error = message(code: 'no.duplicate.submissions')
    }
    // Set a new token for CSRF protection
    messages.newToken = SynchronizerTokensHolder.store(session).generateToken(params.SYNCHRONIZER_URI)
    render messages as JSON
}

有没有人可以识别我是否在不知情的情况下在上述解决方案中引入了一个安全缺陷。它看起来足够我,但我不喜欢手滚任何与安全有关的事情。

共有1个答案

江航
2023-03-14

不错!

IMO,你最好同时重置令牌。

synchronizerTokensholder.store(会话).resetToken(Params.synchronizer_URI)

如果在同一页面中有多个表单,则定义一个变量来保存从每个ajax请求返回的令牌。

顺便说一句,为什么不自己实现令牌模式呢?

  • 生成令牌,例如uuid.randomuuid().toString(),并以url作为密钥将其存储到会话中。
  • 在post操作时检查并重置令牌。
 类似资料:
  • 问题内容: 特别是,我正在编写Django RESTful API来支持iOS应用程序,每当编写用于处理POST请求的方法时,我都会不断遇到Dj​​ango的CSRF保护。 我的理解是,iOS管理的cookie不会被应用程序共享,这意味着我的会话cookie是安全的,并且没有其他应用程序可以使用它们。这是真的?如果是这样,我可以将我所有的API函数都标记为CSRF免除吗? 问题答案: 那不是CSR

  • 问题内容: 使用AntiForgeryToken要求每个请求都传递一个有效的令牌,因此带有简单脚本将数据发布到我的Web应用程序的恶意网页将不会成功。 但是,如果恶意脚本首先发出一个简单的GET请求(由Ajax发出),以便在隐藏的输入字段中下载包含防伪令牌的页面,然后将其提取出来并用于进行有效的POST,该怎么办? 是否有可能,或者我缺少什么? 问题答案: 是的,这就是您需要做的。 只要您在每个受

  • 本文向大家介绍csrf 攻击是怎样攻击的? 如何防御相关面试题,主要包含被问及csrf 攻击是怎样攻击的? 如何防御时的应答技巧和注意事项,需要的朋友参考一下 get, post, delete, 分开, 避免使用get修改数据 避免让第三方站点访问cookie 对referrer进行验证 token 阻止第三方请求 .

  • 什么是CSRF CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 那么CSRF到底能够干嘛呢?你可以这样简单的理解:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求。攻击者只要借助少许的社会工程学的诡计,例如通过QQ等聊天软件发送的链接(有些还伪装成

  • 我正在从事一个有悬而未决的checkmarx问题(最近从veracode迁移过来)的项目,这个安全性方面存在一个问题: Checkmarx不喜欢它,给我看这个: 证券配置。java从disable的用户请求中获取参数。该参数值在代码中流动,最终用于访问应用程序状态改变功能。这可能会启用跨站点请求伪造(XSRF) 还要补充的是,在这个springboot中发出的请求是用idtoken处理的,根据我找

  • 本文向大家介绍Flask模拟实现CSRF攻击的方法,包括了Flask模拟实现CSRF攻击的方法的使用技巧和注意事项,需要的朋友参考一下 CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。 CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账...... 造成的问题:个人隐私