【问题标题】:Cross-Domain API Access Security跨域 API 访问安全
【发布时间】:2016-01-26 00:35:23
【问题描述】:

这是一个关于跨域 API 安全的问题。提出这个问题以便对其他人有用的最好方法是通过一个假设的例子。

  • 域 APIHOST.COM 希望允许访问其资源到 FRIENDLYSITE1.COM 和 FRIENDLYSITE2.COM(但不允许其他域)
  • FRIENDLYSITE 归他人所有,APIHOST 没有直接的服务器访问权限。他们可能正在运行任何服务器技术。他们愿意托管额外的内容,但不要太复杂。

当 Bob 使用他的网络浏览器访问 FRIENDLYSITE1.COM 时,他的 FRIENDLYSITE1.COM(或 APIHOST.COM)的凭据是不相关的。应在 APIHOST.COM 和 FRIENDLYSITE1.COM 之间处理安全问题。

我研究了所有跨域请求技术(CORS、iFrames、JSONP),但所有这些技术都假设安全性应该来自浏览器 Bob,而不是来自 Bob 正在访问的 FRIENDLYSITE1.COM 域.

有没有办法在不涉及 Bob 和他的浏览器的情况下,在两台服务器之间处理安全性的跨域 API 访问?

【问题讨论】:

  • 您是否尝试允许从 FRIENDLYSITE1.COM 托管的网页中的 Javascript 访问 APIHOST.COM,或者您是否尝试在直接从 FRIENDLYSITE1.COM 的网站进行 API 调用时允许访问 APIHOST.COM服务器?这里有很大的不同。在一种情况下,该连接源自特定网页的用户浏览器。在另一种情况下,连接来自服务器的安全环境。
  • 理想情况下,FRIENDLYSITE 无需更新其服务器上的任何内容。但是,用于验证 API 调用安全性的应该是 FRIENDLYSITE 的凭据。
  • FRIENDLYSITE 的凭据是什么? FRIENDLYSITE 的每个网络请求都不会发送“自动”凭据。您无法可靠地验证 Web 请求的来源。您需要与请求一起发送的实际秘密凭据才能对请求进行身份验证。您可以执行反向 DNS 来尝试确定请求是否来自 FRIENDLYSITE 拥有的 IP 地址,但从安全角度来看,这远非完美。

标签: javascript jquery iframe cors jsonp


【解决方案1】:

如果您想保护两台服务器之间的通信,那么您将需要使用安全传输(如 https)并使用一些仅提供给您希望允许访问的站点的凭据。

如果您愿意,这些凭据可以像用户名和密码一样简单。在这种情况下,您将向 FRIENDLYSITE1.COM 提供一些凭据,并且每当它想与 APIHOST.COM 建立连接时,它将在每个 API 请求中包含这些凭据(或者您的 API 可能支持创建 cookie 的登录,然后可以用于后续 API 调用)。


另一方面,如果您的问题的真正意思是 FRIENDLYSITE1.COM 托管的网页中包含 Javascript,并且这些网页中的 Javascript 想要访问 APIHOST.COM,那么就是不同的情况。由于这种情况实际上是从用户计算机上的浏览器连接的(一个不安全的环境),因此您使用前面示例中的凭据会将这些凭据公开给任何人,因此它们不再是秘密的。

在这种情况下,您能做的最好的事情是为 CORS 启用 APIHOST.COM,并且只允许站点 FRIENDLYSITE1.COM 和 FRIENDLYSITE2.COM 访问 COR。这将阻止来自任何其他站点的任何网页从浏览器访问 APIHOST.COM,但不会阻止任何服务器或任何服务器代理访问 APIHOST.COM。基本上不可能允许从特定网页访问,但不允许从其他任何地方访问。这是因为网页是完全不安全的,因此您不能使用网页中的凭据,而是将其保密。

【讨论】:

  • 感谢您的回复。我同意服务器到服务器的连接是理想的,但这不是现实世界的场景。 Bob 使用浏览器访问 FRIENDLYSITE.com,FRIENDLYSITE 需要对第三方服务器进行 API 调用才能获取 Bob 所需的内容,但第三方服务器只需要验证请求是否来自 FRIENDLYSITE...不是每个 Bob 都需要登录才能完成请求。 (我希望这是有道理的)
  • @ZackAustin - 您是否了解当 Bob 访问 FRIENDLYSITE 并且 FRIENDLYSITE 网页中的 Javascript 对您的站点进行 API 调用时,API 调用来自 Bob 的浏览器,而不是来自 FRIENDLYSITE?您可以在您的 API 服务器上使用 CORS,以使您的 API 只能从 FRIENDLYSITE 的网页(从浏览器访问时)使用。 CORS 不会阻止非浏览器访问您的 API。您必须为此使用凭据。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多