如何保护JavaScript应用程序的API调用?

时间:2013-08-29 16:34:07

标签: javascript api security

我有一个JavaScript应用程序。

它是用jQuery构建的。

它使用$.get()从服务器提取JSON数据,并使用数据加载拼图。

我想将JavaScript应用程序分发给客户端,并使其易于安装。

我希望它只是给他们一个可以放入他们页面的JavaScript块,它将与我的API进行交互。

我没有传递敏感数据,我的任何API都在保护数据库免受SQL注入等攻击

我只是想尝试防止未经授权使用我的API,我想不出用JavaScript做到这一点的方法,因为任何拥有DOM检查器的人都可以从任何变量中获取任何凭据,或者可以监控任何服务器流量发布或获取数据......

是否可以在另一方验证推荐人?

我知道这不是防弹的,但它不是敏感的数据。我只想尽可能减少未经授权的使用..

有什么想法吗?

注意:我知道混淆API密钥或其他东西是徒劳的,我想知道除了传统的密钥之外我还可以使用什么其他控件来识别API的调用者..我完全控制API本身,所以我可以做任何事情......

1 个答案:

答案 0 :(得分:17)

使用JavaScript,几乎任何身份验证系统都会有漏洞,因为代码直接在浏览器中运行,任何人都可以看到(网络调用也可以)。所以你可以尝试一些事情,具体取决于你的情况。

如果您要将此应用程序分发给一小部分客户端,并且您确切知道它们将从何处访问它,则可以使用IP白名单。这确实是完全保护API的唯一方法。然而,这种方法非常麻烦,因为每个新客户端都需要更新API白名单,并考虑到你在这里谈论的内容可能不是你想要的(但我之所以提到它只是因为它是可能的)。

另一种方法是访问令牌。这是Facebook等网站常用的方法。有两种方法可以做到这一点。一种是给每个客户一个秘密密钥。您可以为每个人提供相同的密钥,但这不是很安全。为每个人提供不同的密钥,不仅可以跟踪使用情况,还可以在必要时撤消访问权限。

访问令牌的第一种方法是将其放在JS客户端中。但是,这意味着任何查看源代码的人都可以访问您的密钥,并使用它来发出请求。

第二种方法是将密钥存储在客户端运行的网站的SERVER上。然后,此服务器可以使用该密钥进行服务器到服务器调用,以获取临时会话令牌。人们仍然可以通过前端访问临时会话令牌,但他们必须首先访问此站点才能获得它(这允许您将处理此事务的责任转移给网站运营商)和令牌最终会到期。然而,这意味着需要一些服务器端代码,而应用程序不仅仅是一个拖放的东西。

对于上面给出的方法,您还可以查看OAuth之类的内容,以避免重新发明轮子。

使用IP的另一个可能的事情是设置一个特定IP可以达到白名单的频率或每天多少次的硬性上限。虽然你可能会遇到真正喜欢这些谜题的用户的问题,但这可以防止一些潜在的滥用。