13

我有一个 JavaScript 应用程序。

它是用 jQuery 构建的。

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

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

我希望它简单地给他们一个 JavaScript 块,他们可以放入他们的页面,它会与我的 API 交互。

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

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

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

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

有任何想法吗?

注意:我知道混淆 API 密钥或某些东西是徒劳的,我想知道除了识别 API 调用者的传统密钥之外,我还可以设置哪些其他控件。我可以完全控制 API 本身,所以我可以在这方面做任何事情......

4

1 回答 1

23

JavaScript 身份验证有漏洞

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

IP 白名单

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

访问令牌

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

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

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

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

白名单硬顶

使用 IP 的另一个可能的事情是对特定 IP 可以进入白名单的频率或每天多少设置硬上限。尽管您可能会遇到真正喜欢谜题的用户的问题,但这将防止一些潜在的滥用。

于 2013-08-29T16:54:33.700 回答