gpt4 book ai didi

javascript - 在客户端设置 XSRF cookie

转载 作者:行者123 更新时间:2023-11-30 17:35:53 27 4
gpt4 key购买 nike

我想通过设置 cookie 并在每个 POST/PUT/DELETE 请求中发送具有相同值的 HTTP header 来为我的应用程序实现 CSRF 预防机制。在我读到的所有地方,最佳实践建议应该从服务器设置 csrf cookie。我正在使用 AngularJS 构建一个单页应用程序,他们还建议出于安全原因,cookie 应该由服务器在第一次 GET 请求时发送。

我的问题是 - 为什么服务器应该发送 cookie 而不是仅使用简单的 javascript 和生成的随机 uuid 值在客户端上设置它?

此外,如果您有一个可供所有人访问的公共(public)应用程序,但仍需要保护它免受 csrf 攻击,如果用户没有 session cookie,服务器端将如何记住它发送给哪些用户的 token ?

最佳答案

why should the server send the cookie...

这样服务器就可以知道(验证)来自您应用的第二个请求完全来自您的应用(因为同一个应用是第一个请求响应的唯一接收者)。我说 token 不用于授权,因为它直接派生自 token 映射到的用户。例如,您不能使用 token 删除另一个用户。但是,您的代码仍然可能被利用,并且该 token 会被恶意代码破坏,但让我们稍后再考虑。

...and not just set it on the client...

任何预先设置的通信服务于不同的目的,看看https://en.wikipedia.org/wiki/Shared_secrethttps://en.wikipedia.org/wiki/Symmetric-key_algorithm .您的应用程序是公开的,这回答了为什么不提前在客户端上设置它。

using simple javascript and a generated random uuid value?

设置 uuid 是没有意义的,因为任何人都可以做到:您的服务器无法区分来自您的应用程序的 uuid 和来自黑客的 uuid。

Also, if you have a public app that can be accessed by everyone and still need to protect it from csrf...

但是如果您的应用(以及其中的 API)是公开的,您不应该保护它,对吗?试试 curl https://api.github.com/users/mongodb/repos。我最近了解到您可以通过提供 cookie atl.xsrf.token=no-check 来禁用 Bamboo api 的 XSRF 保护(也可以通过 header 工作,请注意 JSESSIONID 仍用于实际身份验证)。

how would the server side remember what token it sends to what user, if they do not have session cookies?

XSRF token 通常作为自定义 X- HTTP header 出现。或者甚至作为路径/查询参数,不需要 cookie。

XSRF 仅用于验证您应用的下一个请求,方法是使用您的 api 在上次请求时为您的应用提供的 token (或您免费获得新 token 的初始 GET)。正如另一个答案正确指出的那样,服务器可以决定在每次幂等请求时更改 token 。标准做法是为每个请求创建一个新 token ,无论如何生成它们都很便宜。

最后但同样重要的是,考虑一些利用场景:

  • 如果我设法注入(inject)一些 javascript 并获取 token 所在的应用程序 cookie(或 dom 或 js 命名空间或通过某些 js getter 访问您的 token ),那么我可以发出经过身份验证的 DELETE 请求到你的 api
  • 如果我设法将您的应用程序重定向到我的服务器(任何类型的欺骗您的 DNS,没有 ssl 等等)并且我得到了您的 token ,我的下一个 DELETE 请求可能会被拒绝,如果:
    • 您的服务器希望每个请求都有一个新 token ,并且...
    • 你设法比我更快地提出请求,我会再试一次,或者......
    • 服务器足够聪明,可以看到具有相同 token 的多个请求来自不同的 IP,并且至少会像 gmail 一样给您一个警告
  • 如果我设法重定向你的服务器 api 的响应(意味着我有一个新的 token ),我的 DELETE 请求将会成功,但你的下一个请求会给你一个警告,说你正在访问一个过时的资源(我的请求已以某种方式修改)。我认为这是对您的 session 的乐观锁定。

总而言之,不要将 csrf 用于您的公共(public) api。在呈现数据时使用它,在代码中或在幂等调用中包含远程资源,然后妥善保护它。希望这一切都有意义。

关于javascript - 在客户端设置 XSRF cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22080064/

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