Javascript 如何在AJAX应用程序中保护私有RESTAPI

Javascript 如何在AJAX应用程序中保护私有RESTAPI,javascript,security,api,rest,node.js,Javascript,Security,Api,Rest,Node.js,我知道有很多类似的问题发布,但没有一个涉及到用户可以访问代码的HTML/javascript应用程序 我有一个用nodejs编写的私有restapi。它是私有的,因为它的唯一用途是为我的HTML5客户端应用程序(Chrome应用程序和AdobeAIR应用程序)提供服务器。因此,API密钥不是一个好的解决方案,因为任何用户都可以看到javascript代码 我希望避免机器人在我的服务器上创建帐户并消耗我的资源 有什么方法可以实现这一点吗?API密钥是一个不错的解决方案,特别是当您需要对API密钥的

我知道有很多类似的问题发布,但没有一个涉及到用户可以访问代码的HTML/javascript应用程序

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

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


有什么方法可以实现这一点吗?

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

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


您要做的是使用相互验证的SSL,这样您的服务器将只接受来自您的应用程序的传入连接,并且您的应用程序将只与您的服务器通信

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

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


一步一步地解决这个问题是一个比这里所保证的要长得多的答案。我建议分阶段执行此操作,因为web上有关于如何在Android中处理自签名SSL证书的资源(我不太熟悉如何在其他移动平台上执行此操作),包括服务器端和客户端。我在O'Reilly出版的《Android平台的应用程序安全》一书中也有完整的介绍。

同样重要的是,API密钥解决方案适用于数十种其他API,包括谷歌地图、Flickr、Facebook等。诀窍在于实现。我无法控制我的用户来自何方,这是一个公共应用程序。谷歌地图、Flickr等使用API键,但我不确定他们是否担心谁使用这些键。我认为我可以复制和使用任何Google maps密钥(没有尝试过)。你不能简单地复制Google maps API密钥并在另一个域中使用,因为Google maps API将生成的每个API密钥绑定到一个特定的域类(即mydomain.com),并且传入的每个请求都会根据引用的URL进行检查,以及API密钥中编码的其他信息。同样,典型的编码机制是HMAC。否则API键就没用了。但引用者可能会被欺骗,所以我不知道这有多有效:我的web应用程序是纯javascript和HTML,而不是Android,而且这种方法仍然有效。在应用程序的web服务器和任何要与之通信的客户端之间强制执行相互身份验证SSL。对于标准web浏览器,我如何才能做到这一点?比如说谷歌浏览器。你需要生成一个客户端证书,并将其作为身份证书加载到浏览器的密钥库中。你如何做到这一点取决于浏览器。但我不能向我的用户询问这一点。我不认为他们会知道怎么做。我不确定是否有任何答案能满足你的问题。请分享您是如何处理您描述的问题的。我正在构建基于REST+AJAX的web应用程序,可用于未注册用户。和你一样,我想保护资源不受机器人的攻击。从逻辑上讲,如果API是从任何人都可以查看源代码和/或监视发送到服务器的数据的网页调用的,那么就没有办法使其真正私有化。要捕获机器人,您需要一些常见的技巧,如验证码,但最终您需要后端支持(WAFs、快速自动缩放等),以应对自动DDOS类型攻击的可能性。只要您尽可能早地检测到可能的DDOS攻击(在建立数据库连接等之前),处理试图下载页面的机器人程序就无异于此。