【问题标题】:Is it safe to serve jsonp if I require authentication headers?如果我需要身份验证标头,提供 jsonp 是否安全?
【发布时间】:2011-08-20 14:14:46
【问题描述】:

我想提供 jsonp,以便其他站点可以从我的站点获取 json 数据。我知道如果我使用 cookie 对用户进行身份验证会很危险,因为浏览器会将 cookie 连同所有请求一起发送到我的网站,因此恶意页面可能会在不询问用户的情况下代表我的用户发出经过身份验证的请求。

对我的服务的所有请求都必须使用请求上设置的特殊标头X-AG-AUTH 进行身份验证。必须在该标头中设置标识用户的秘密令牌。

如果用户不提供秘密令牌,恶意网站是否能够通过 jsonp 从我的服务中获取数据?

【问题讨论】:

  • 是不是恶意用户可以从真实用户那里获取认证密钥,然后在他们不知情的情况下窃取它?因为 JSONp 的全部意义在于它可以被 JS 使用,并且 JS 将 100% 公开。可以使用的一种技术(但从用户的角度来看非常麻烦)是将密钥与域相关联,而不是与用户相关联。然后当你收到请求时,你可以检查referrer。
  • 请求还必须为每个用户设置一个秘密,这样一个用户就无法访问另一个用户的数据。秘密不一定是用户的主密码,而是一些标识站点/用户组合的标识符。但我的问题是:如果用户不给网站他的

标签: javascript json jsonp csrf


【解决方案1】:

好吧,要求 jsonp 调用的自定义标头会使 jsonp 调用对于来自其他域的请求无用,因为您的调用者将无法设置这些标头。

您可以使用类似的方法:要求在 POST 请求中将 CSRF-prevention-style token 作为参数传递。这将要求您与要允许调用端点的每个站点共享生成这些令牌的逻辑和密钥。当然,如果这些密钥中的任何一个在远程服务器端被泄露,你可能不会知道,直到为时已晚。

如果您愿意为使用非常旧的浏览器的人放弃功能,您可以使用带有解析器破坏前缀的regular JSON over CORS* 来防止跨站点脚本包含。

我假设您的数据不是您想要公开的,在这种情况下,您希望也需要 SSL。

【讨论】:

  • 感谢您的回答。为什么调用者不能在请求中设置标头?
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 2019-02-21
  • 1970-01-01
  • 2020-10-20
  • 2018-01-04
  • 2011-02-25
  • 2021-01-06
  • 2011-11-18
相关资源
最近更新 更多