将 csrf 令牌传递给客户端应用程序

Posted

技术标签:

【中文标题】将 csrf 令牌传递给客户端应用程序【英文标题】:Passing csrf token to client application 【发布时间】:2015-03-13 22:19:54 【问题描述】:

我有一个 Web 应用程序,它被分成两个独立的模块(客户端和服务器端)。服务器定义了 REST 服务,客户端调用 REST 服务来获取数据。我想让服务器免受 CSRF 攻击。因此,任何客户端 POST/PUT/DELETE 都需要在标头中传递 csrf 令牌,并且令牌值应等于会话中保存的 csrfToken。 我的问题是由于 csrf 令牌是由服务器生成的,客户端应用程序如何获取令牌值? 客户端登录后是否应该发送GET请求,服务器生成csrf令牌将其存储为会话属性并将其发送回客户端作为响应还是更好的解决方案?

【问题讨论】:

CSRF 保护在 REST 协议中不起作用。 @holmis83 owasp.org/index.php/… @sp00m 该页面上有很多废话。但是,也许我误解了 OP 中“REST”的含义。 【参考方案1】:

是否要在客户端创建 csrf 令牌取决于您想要什么?

csrf 令牌总是在登陆页面或用户在服务器端后端黑盒逻辑的第一个 ajax 请求上创建...

客户端意味着如果使用jsp,那么您可以轻松编写代码,因为jsp位于服务器端,并且它作为我们所知道的程序员的所有好处......

如果在应用程序中我们使用 js 或基于 js 的框架 [如 extjs、dojo take kit、angularjs、yui 或任何其他],并且我们的视图是 .html 文件,那么我觉得我们使用登录页面 ....

登陆页面意味着第一页......或者如果我们使用ajax,那么当用户点击我们的服务器时,用户对服务器的第一个ajax请求......

通过第一个 ajax 请求或登录页面,您可以生成一个令牌并在该用户的整个会话之后将会话保存为 csrf 令牌,您必须通过编写过滤器来检查 csrf 令牌...

在过滤器中必须检查用户会话不为空,并且用户是登录用户,并且基于您的应用程序的权限和会话具有 csrf 令牌...

所以每个新用户都必须通过您的登录页面[登录页面]并在服务器端获得一个会话,因此不允许任何虚假请求并且您拥有一个安全层

享受:)

【讨论】:

问题是如何与 REST 应用程序共享在 UI 页面上创建的令牌。会话策略如何处理同一个用户在浏览器中打开两个不同的选项卡?就 ajax 策略而言,可以设计一个表单来从恶意站点发送该 Ajax 请求。 对于需要开发逻辑的..我正在使用 REST 应用程序..对于需要应用逻辑来创建令牌字符串的需要......您也可以将 spring 安全性应用于 REST 应用程序 我不明白您的最后评论,但是 spring security 如何与单独的 UI 应用程序共享它的 CSRF 令牌?假设它是否在 nodejs (Expressjs) 上运行。 为此,请在线查找资料。在我当前的项目中,我使用了 angular js、jersey rest、spring MVC、Spring Security 和 JPA ..如果你知道 spring security 它是安全的... OP 已经特别要求解决两个应用程序的情况。使用 spring 的单个应用程序中的 CSRF 不需要任何努力。

以上是关于将 csrf 令牌传递给客户端应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将 POST 数据中的 CSRF 令牌传递给 Django?

将 csrf 令牌传递给 Stripe

将 CSRF 令牌从节点传递给 REACT/FLUX

使用 CSRF_COOKIE_HTTPONLY 将 Django CSRF 令牌传递给 Angular

REST API 中的 CSRF 令牌

何时将刷新令牌传递给 API