如何通过仅允许受信任的域来保护API?
我正在构建REST API。我需要一种方法来分发API密钥,但只允许它们在注册的域中工作。
主要问题是我的API密钥需要嵌入到Flash文件中,可以轻松反编译以窃取API密钥。如果Flash使这变得不可能,我可以使用Javascript代替。
我听过很多人说使用$_SERVER['HTTP_REFERER']
。但这很容易被欺骗。
这些问题是相关的,但并没有完全回答我的问题。想我会把它们放在这里供将来参考。
答案 0 :(得分:0)
JavaScript在这里不会帮助你 - 问题是密钥存储在客户端上,这意味着它不安全。你肯定可以让攻击者更难一点(例如你说检查引用者),但是在一天结束时,所有服务器都可以验证密钥是否正确,并且因为密钥很容易被窃取不是很有帮助。
这可以保证的方法是让私钥在您提供给他们的服务器上运行,而不是在客户端。根据您的需要,这可能不太可行。
使攻击者更难一点的一种可能性是使用站点锁定技术,只允许SWF在适当的域上调用API。有关示例,请参阅http://blog.boogatech.com/as3_tutorial_site-locking_your_flash_project/。但是请注意,这是客户端安全性 - 坐席的目标通常只是阻止人们在其他网站上玩游戏(即便如此,它也无法阻止最专注的攻击者)。在您的情况下,您正在处理服务器安全性 - 服务器不知道SWF,它只知道它正在被馈送的参数,因此攻击者可以绕过SWF和客户端安全性并从其他地方调用API
我建议您考虑一下您要阻止的攻击和攻击者(为什么必须将API密钥绑定到域?)。这有助于您更好地规划安全尝试。例如,如果您没有运行超关键API,您可以决定放置一些东西以使攻击者更难以访问API是可以接受的,因为您知道无法阻止极其专门的攻击者