如何在AJAX应用程序中保护私有REST API

时间:2012-01-18 23:07:00

标签: javascript security api rest node.js

我知道发布了许多类似的问题,但没有一个是指用户可以访问代码的HTML / javascript应用程序。

我有一个用nodejs编写的私有REST API。它是私有的,因为它的唯一目的是为我的HTML5客户端应用程序(Chrome应用程序和Adobe Air应用程序)提供服务。因此,API密钥不是一个好的解决方案,因为任何用户都可以看到javascript代码。

我想避免机器人在我的服务器上创建帐户并消耗我的资源。

有没有办法来实现这个目标?

2 个答案:

答案 0 :(得分:15)

API密钥是一个不错的解决方案,尤其是当您需要对API密钥的请求源进行约束时;如果原始Web请求来自授权来源(例如您的私有域),请考虑您应该只接受API密钥。如果Web请求来自未经授权的域,您可以直接拒绝处理请求。

您可以通过使用专门的编码方案(例如基于散列的消息身份验证代码(HMAC))来提高此机制的安全性。以下资源清楚地解释了这种机制:

http://cloud.dzone.com/news/using-api-keys-effectively

答案 1 :(得分:1)

您要做的是使用经过相互身份验证的SSL,以便您的服务器只接受来自您应用的传入连接,而您的应用只会与您的服务器进行通信。

这是高级方法。创建自签名服务器SSL证书并在Web服务器上部署。如果您使用的是Android,则可以使用Android SDK附带的keytool来实现此目的;如果您正在使用其他应用程序平台,那么也存在类似的工具。然后创建一个自签名客户端,并将其作为资源在应用程序中包含的自定义密钥库中部署到您的应用程序中(keytool也会生成它)。将服务器配置为要求客户端SSL身份验证,并仅接受您生成的客户端证书。配置客户端使用该客户端证书来标识自己,并且只接受您在服务器上安装的那个服务器端证书。

如果您的应用以外的某人/某些人尝试连接到您的服务器,则不会创建SSL连接,因为服务器将拒绝未提供您的应用中包含的客户端证书的传入SSL连接。 / p>

这是一个循序渐进的答案,比这里所保证的要长得多。我建议分阶段这样做,因为网上有关于如何在Android中处理自签名SSL证书的资源(我不熟悉如何在其他移动平台上执行此操作),包括服务器端和客户端端。在我的书“安卓平台的应用程序安全”中,还有一个完整的演练,由O'Reilly出版。