【问题标题】:How do I secure an API by only allowing trusted domains?如何通过仅允许受信任的域来保护 API?
【发布时间】:2012-07-27 19:27:29
【问题描述】:
问题
如何通过仅允许受信任的域来保护 API?
详情
我正在构建一个 REST API。我需要一种分发 API 密钥的方法,但只允许它们在注册的域中工作。
主要问题是我的 API 密钥需要嵌入到 Flash 文件中,该文件很容易被反编译以窃取 API 密钥。如果 Flash 无法做到这一点,我可以改用 Javascript。
我听很多人说使用$_SERVER['HTTP_REFERER']。但这很容易被欺骗。
- 如何构建 API 以确保请求来自允许的域?
- 如何创建与域绑定的 API 密钥?
- 如何通过仅允许受信任的域来保护 API?
相关 Stackoverflow 问题:
这些问题是相关的,但并没有完全回答我的问题。想我会把它们放在这里以供将来参考。
【问题讨论】:
标签:
actionscript-3
api
codeigniter
security
【解决方案1】:
JavaScript 在这里帮不了你 - 问题是密钥存储在客户端上,这意味着它不安全。您当然可以让攻击者更加困难(例如,就像您说检查引荐来源网址),但归根结底,所有服务器都可以验证密钥是否正确,并且由于密钥很容易被盗,那就是不是很有帮助。
保护这一点的方法是让私钥在您提供给它们的任何人的服务器上运行,而不是在客户端中运行。根据您的需要,这可能不可行。
让攻击者更难的一种可能性是使用站点锁定技术,只允许 SWF 调用位于适当域中的 API。有关示例,请参阅http://blog.boogatech.com/as3_tutorial_site-locking_your_flash_project/。但请注意,这是客户端安全性 - 站点锁定的目标通常只是阻止人们在其他网站上玩您的游戏(即便如此,它也无法阻止最敬业的攻击者)。在您的情况下,您正在处理服务器安全性 - 服务器不知道 SWF,它只知道它正在输入的参数,因此攻击者可以绕过 SWF 和客户端安全性并从其他地方调用 API .
我建议您考虑一下您要阻止的攻击和攻击者(为什么必须将 API 密钥绑定到域?)。这将帮助您更好地计划安全尝试。例如,如果你没有运行一个超关键的 API,你可以决定加入一些东西来让攻击者更难访问 API,因为你无法阻止一个非常专注的攻击者.