1

问题

如何通过仅允许受信任的域来保护 API?

细节

我正在构建一个 REST API。我需要一种分发 API 密钥的方法,但只允许它们在注册的域中工作。

主要问题是我的 API 密钥需要嵌入到一个 Flash 文件中,该文件很容易被反编译以窃取 API 密钥。如果 Flash 使这成为不可能,我可以改用 Javascript。

我听很多人说用$_SERVER['HTTP_REFERER']。但这很容易被欺骗。

  • 如何构建 API 以确保请求来自允许的域?
  • 如何创建绑定到域的 API 密钥?
  • 如何通过仅允许受信任的域来保护 API?

相关的 Stackoverflow 问题:

这些问题是相关的,但并没有完全回答我的问题。想我会把它们放在这里以供将来参考。

4

1 回答 1

0

JavaScript 在这里帮不了你——问题是密钥存储在客户端上,这意味着它不安全。您当然可以让攻击者更难一些(例如,就像您说检查引荐来源网址),但归根结底,所有服务器都可以验证密钥是否正确,并且由于密钥很容易被盗,那就是不是很有帮助。

可以保护这种情况的方法是让私钥在您提供给它们的任何人的服务器上运行,而不是在客户端中运行。根据您的需要,这可能不可行。

使攻击者更难的一种可能性是使用站点锁定技术,仅当 SWF 位于适当的域上时才允许它调用 API。有关示例,请参见http://blog.boogatech.com/as3_tutorial_site-locking_your_flash_project/ 。但是请注意,这是客户端安全 - 站点锁定的目标通常只是阻止人们在其他站点上玩您的游戏(即使这样也无法阻止最敬业的攻击者)。在您的情况下,您正在处理服务器安全性 - 服务器不知道 SWF,它只知道它正在输入的参数,因此攻击者可以绕过 SWF 和客户端安全性并从其他地方调用 API .

我建议您考虑一下您要阻止的攻击和攻击者(为什么必须将 API 密钥绑定到域?)。这将帮助您更好地计划安全尝试。例如,如果你没有运行一个超关键的 API,你可以决定加入一些东西来让攻击者更难访问 API,因为你无法阻止一个非常专注的攻击者.

于 2012-07-27T20:52:56.190 回答