如何保护AJAX应用程序中的私人REST API

我知道发布了许多类似的问题,但是他们都没有提到用户可以访问代码的HTML / JavaScript应用程序。

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

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

有什么办法来实现这个吗?

API密钥是一个体面的解决scheme,特别是如果您需要API密钥请求源的限制; 如果原始networking请求来自授权来源(例如您的私人网域),则认为您只应接受API密钥。 如果networking请求来自未经授权的域名,则可以拒绝处理该请求。

您可以通过使用专门的编码scheme(如基于散列的消息authentication码(HMAC))来提高此机制的安全性。 以下资源清楚地解释了这个机制:

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

你想要做的是采用相互authentication的SSL,这样你的服务器将只接受来自你的应用程序的传入连接,你的应用程序将只与你的服务器通信。

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

如果您的应用程序以外的其他人尝试连接到您的服务器,则SSL连接将不会被创build,因为服务器将拒绝未提供您的应用程序中包含的客户端证书的传入SSL连接。

这一步是一个更长的答案比这里保证。 我会build议这样做,因为网上有资源如何处理Android中的自签名SSL证书(我不太熟悉如何在其他移动平台上执行此操作),无论是服务器端还是客户端。 在O'Reilly出版的“Android平台的应用程序安全性”一书中也有一个完整的介绍。