是否可以将 API 访问限制从 javascript 小组件到合作伙伴站点的域?

Can I restrict API access from a javascript widget to a partner site’s domain?

提问人:Asaph 提问时间:6/3/2014 最后编辑:CommunityAsaph 更新时间:6/3/2014 访问量:1204

问:

我想开发一个客户端 javascript 小部件,该小部件可能仅包含在授权的合作伙伴网站上。javascript 小部件将对主网站进行 REST 调用。合作伙伴网站应该能够使用 javascript 小部件,而无需安装任何服务器端组件。未经授权的站点使用给定密钥的任何尝试都应失败。显然,任何交付给 Web 浏览器的 API 密钥最终都容易受到暴露,即使它们以某种方式被遮挡了。

我寻找的一个真实世界的例子是 Google Maps Javascript API v3,它施加了配额限制,并可以选择性地允许 API 客户端将给定密钥的访问限制为指定域。但看起来这个限制是基于推荐人的,这似乎太容易伪造了。使用此系统的网站似乎容易受到攻击者的攻击,攻击者使用其密钥(在 HTML 中以纯文本形式可见)并运行足够的 API 调用以超过配额。同样值得注意的是,谷歌区分了“浏览器密钥”和“服务器密钥”。

以下是我发现的一些相关问题,没有一个有令人鼓舞的答案:

是否有现有的设计模式、标准或加密方案可以解决这个问题?或者如果没有一些服务器端组件,就没有办法做到这一点?

JavaScript API 安全 客户端

评论

0赞 dandavis 6/3/2014
“referers,这似乎太容易伪造了”:由于任何有伪造 referer 技能的人都可以免费获得自己的 API 密钥,因此我看不到潜在的回报或损失。你可以用你的PHP重新代理API,这样你就可以对用户进行身份验证,并使你的API密钥保密,但这有点破坏了第三方API的好处......不要以为谷歌会让一个用户无所畏惧地敲打他们的机器,直到池配额用完,每个客户端也有限制......
0赞 Asaph 6/3/2014
就我而言,API 密钥不是免费的。为了解决您关于潜在收益或损失的观点,在这种情况下,攻击者的动机是通过耗尽其配额来拒绝 API 客户端站点上的服务。
1赞 dandavis 6/3/2014
如果你的密钥不是免费的,并且你担心对手,那么你应该重新代理PHP中的所有内容,以保持你的宝贵信息的私密性。它还让您有机会缓存常见请求,从而减少您的整体 API 密钥消耗、验证用户身份、检测机器人等。 简而言之:它从无控制转变为完全控制。由于物理学的原因,恐怕中间没有太多的中间因素。

答: 暂无答案