Javascript 跨域API访问安全

Javascript 跨域API访问安全,javascript,jquery,iframe,cors,jsonp,Javascript,Jquery,Iframe,Cors,Jsonp,这是一个关于跨域API安全性的问题。问这个问题以便对其他人有用的最好方法是通过一个假设的例子 域APIHOST.COM希望允许访问FRIENDLYSITE1.COM和FRIENDLYSITE2.COM的资源(但不允许访问其他域) FriendLysite归其他人所有,APIHOST没有直接的服务器访问权限。他们可能正在运行任何服务器技术。他们愿意提供额外的内容,但不会太复杂 当Bob使用web浏览器访问FRIENDLYSITE1.COM时,他在FRIENDLYSITE1.COM(或APIHO

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

  • 域APIHOST.COM希望允许访问FRIENDLYSITE1.COM和FRIENDLYSITE2.COM的资源(但不允许访问其他域)
  • FriendLysite归其他人所有,APIHOST没有直接的服务器访问权限。他们可能正在运行任何服务器技术。他们愿意提供额外的内容,但不会太复杂
当Bob使用web浏览器访问FRIENDLYSITE1.COM时,他在FRIENDLYSITE1.COM(或APIHOST.COM)上的凭据与此无关。应在APIHOST.COM和FRIENDLYSITE1.COM之间处理安全问题

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


如果安全性在两台服务器之间处理,而不涉及Bob和他的浏览器,是否有一种方法可以进行跨域API访问?

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

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


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


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

您是想允许从FRIENDLYSITE1.COM托管的网页中的Javascript访问APIHOST.COM,还是想在直接从FRIENDLYSITE1.COM的web服务器调用API时允许访问APIHOST.COM?这里有很大的不同。在一种情况下,连接源自用户的浏览器中的特定网页。在另一种情况下,连接来自服务器的安全环境。理想情况下,FRIENDLYSITE不需要更新服务器上的任何内容。但是,应该使用FRIENDLYSITE的凭据来验证API调用的安全性。FRIENDLYSITE的凭据是什么?FRIENDLYSITE的每个web请求都不会发送“自动”凭据。您无法可靠地验证web请求的来源。您需要与请求一起发送实际的机密凭据才能对请求进行身份验证。您可以使用反向DNS来尝试确定请求是否来自FRIENDLYSITE拥有的IP地址,但从安全角度来看,这还远远不够完美。感谢您的回复。我同意服务器到服务器的连接是理想的,但这不是一个现实的场景。Bob使用浏览器访问FRIENDLYSITE.com,FRIENDLYSITE需要对第三方服务器进行API调用以获取Bob所需的内容,但第三方服务器只需验证请求是否来自FRIENDLYSITE。。。并非每个Bob都需要登录才能完成请求。(我希望这是有意义的)@ZackAustin-你知道当Bob访问FRIENDLYSITE,并且FRIENDLYSITE网页中的Javascript对你的站点进行API调用时,API调用来自Bob的浏览器,而不是FRIENDLYSITE吗?您可以在API服务器上使用CORS,使您的API只能从FRIENDLYSITE的网页(从浏览器访问时)使用。CORS不会阻止非浏览器访问您的API。你必须为此使用凭据。