【问题标题】:Secure API in javascript [duplicate]javascript中的安全API [重复]
【发布时间】:2019-07-22 07:44:29
【问题描述】:

我想让我的客户访问我的 API。 为了方便客户使用我的服务,他们只需要将javascript代码粘贴到他们的html页面中。

但是如何区分访问权限?我阅读了有关 jwt、api 密钥和令牌的信息,但它们都应该存储在客户端。这似乎是错误的。

在这种情况下我该怎么办?客户的便利性非常重要,所以我想留下简单地插入 JavaScript 代码的可能性。

也许我可以以某种方式跟踪请求来自的域或类似的东西?

附:我正在使用 Django Rest 框架来构建 API

【问题讨论】:

  • 我不明白为什么粘贴 javascript 被认为是“客户便利”(imo 你可以让他成为一个网页来提供 API)。但是,如果您想通过粘贴 javascript 来识别您的客户端,您的 javascript 需要对您的服务器进行 ajax 调用。并且您的服务器需要对客户端进行身份验证(在您向他发送 javascript 之前生成的令牌,或者例如,将客户端的电子邮件保存在数据库中然后要求他填写)
  • 我网站上的客户端填写了所有必要的数据。我可以给他 API 密钥。我的服务的本质是,在每种自动模式下,每次访问者访问客户的站点时,都会执行 javascript 代码,它会向我的 API 发送请求并显示接收到的数据。问题是有人可以在浏览器中打开开发人员工具,查看 api 密钥,并以我的客户端为幌子对我的 API 执行请求。我想了解如何保护自己免受此类伤害)
  • @AliMan — 你不能。

标签: javascript html api security django-rest-framework


【解决方案1】:

据我了解,您希望保护您的 API 密钥,但与此同时,您发送给他的一些 JS 代码将从客户端调用 API。

那么你怎么能做到这一点呢?

1.打乱你的 js 文件 - 你可以打乱你的 js 文件(jscrambler,混淆器),这样你的代码就无法识别了。然而,这并不能真正保护您的 js,如果幸运的是客户端找到了与 API 密钥对应的加扰变量,那么他们就可以访问它(尽管这种情况不太可能发生)。

2。识别您的客户 - 另一种选择是识别您的客户并仅允许已识别的客户访问您的 API(API 密钥之上的额外安全性)。为此,您可以:

  • 存储您的客户 IP 地址 - 在注册表中询问/收集您客户的 IP 地址并将其存储在您的数据库中。然后根据请求,收集 IP 地址并用于检查客户端是否可以访问您的 API。 但是,如果您的客户没有静态 IP 地址,此过程可能会失败。
  • 创建客户端指纹 - Fingerprint2 使用客户端计算机的多个元素(操作系统、屏幕分辨率、IP 地址、浏览器等),您可以为每个客户端创建“指纹”。它不是 100% 可靠的(虽然非常接近),您还必须将其存储在注册表中。
  • 为每个客户端创建一个 API 密钥 - 您还可以为每个客户端创建一个 API 密钥并将其存储在数据库中。此 API 密钥可以使用上述 2 种方法中的任何一种方法生成(例如,您加密了 IP 地址,这就是您的 API 密钥)。然后,当 JS 代码执行对 API 的调用时,请求的 IP 地址将被加密并检查它是否与 API 密钥匹配。

所有这些方法都不是 100% 防故障的,您会发现误报和误报。但是,如果您向客户端提供 JS 代码,那么您在安全性方面已经受到限制。

我希望这能让您了解可以采取哪些措施来保护您的 API。

如果您有任何其他问题或想了解有关我的建议的更多详细信息,请随时询问!

【讨论】:

  • “运气好,客户端找到了 API 密钥对应的加扰变量”——谁需要运气?他们可以只使用浏览器中的开发者工具来检查传出的 HTTP 请求。
  • "识别您的客户端 - 另一个选择是识别您的客户端并只允许识别的客户端访问您的 API" — 在这里您使用术语“客户端”来表示“浏览器”,但是问题的上下文表明它实际上是“许多不同用户访问的第三方网站”
  • 是的,你的第一点是对的。如果客户端看到 HTTP 请求,它无论如何都会找到 API 密钥。
  • 关于第二点,我明白你的意思。但是,我确实认为如果您在服务器端获得 IP 地址,您将获得“客户端”网络。因此,您可以验证客户端是否(即使访问者可能来自非常不同的 IP 地址)。
  • 由于大多数网站都为“互联网上的任何人”提供服务,因此通过网络缩小范围并没有帮助。互联网是一个非常大的网络。
猜你喜欢
  • 2012-01-07
  • 2013-06-21
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 2015-09-03
  • 2017-02-23
相关资源
最近更新 更多