我正在Grails 2.4.5应用程序中设计CSRF防御 .

我想使用Synchronizer Tokens模式,这是我想要的设计,简化:

  • 使用新会话,在服务器上生成一个长唯一的csrf令牌 .

  • 将csrf令牌存储在会话中 .

  • 将csrf标记添加到响应标头中

  • 在服务器上,对于每个可能会更改应用程序状态的传入请求(post,update,delete ...),验证referer / origin与目标相同

  • 在服务器上,对于可能会更改应用程序状态(发布,更新,删除...)的每个传入请求,检查标头中csrf标记的存在和有效性 .
    在grails应用程序中,我想象这发生在Spring Security过滤链中 .

  • 如果令牌不存在或不匹配,则返回错误并记录潜在的CSRF攻击,否则允许请求继续 .

这听起来不错吗?

我担心的是,这还不够 . 正式地,同步器令牌被添加到每个表单以及每个帖子,放置或删除URL . 然而,应用程序不使用表单标签,因此将它添加到应用程序中每个JavaScript生成的表单似乎是繁重的,更不用说需要进行大量测试以确保没有现有功能被破坏 .

谢谢!