gpt4 book ai didi

security - Grails - 是否有推荐的方法来处理 AJAX 形式的 CSRF 攻击?

转载 作者:行者123 更新时间:2023-12-02 22:00:37 26 4
gpt4 key购买 nike

我正在使用标准表单的同步器 token 模式 (useToken = true),但我找不到任何通过 AJAX 处理此问题的推荐方法。

编辑

自从发布这篇文章以来,我已经推出了自己的解决方案,结合了上面的 Grails 现有模式。

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

问题是,在成功响应后,没有新的 token 集(因为页面没有重新加载,并且 g:form taglib 没有被调用),所以我在 Controller 中手动执行此操作,调用与g:形成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);
}
})

在 Controller 中:

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
}

任何人都可以确定我是否在不知不觉中在上述解决方案中引入了安全缺陷。对我来说它看起来足够了,但我不喜欢手动滚动任何与安全有关的东西。

最佳答案

不错!

IMO,您最好同时重置 token 。

SynchronizerTokensHolder.store(session).resetToken(params.SYNCHRONIZER_URI)

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

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

  • 生成一个 token ,例如 UUID.randomUUID().toString(),并将其存储到以 url 作为键的 session 中。
  • 在发布操作时检查并重置 token 。

关于security - Grails - 是否有推荐的方法来处理 AJAX 形式的 CSRF 攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com