javascript - 拥有公共(public) API,但只允许访问从我的网站发送的请求

标签 javascript node.js rest security reactjs

我已经在 Google 和 SO 上搜索了几个小时,但没有找到与我现在面临的挑战相同的人,所以这里是:

我们有一个数据库,我们投入了大量的资金和精力来维护。数据库中的数据可通过 REST-API 公开获取。 我们还有一个使用此 API 的公共(public) JavaScript Web 应用程序,并将其出售给大约 30-40 名客户。由于 API 中的数据对我们来说非常有值(value),因此我们希望 尝试保护它,以便任何人都无法从中获取内容并制作自己的数据库副本。我们也不希望任何人使用我们的 API 构建服务 未经我们同意。同时,我们需要我们的网络应用程序 http://www.example.com/theApp , http://www.example2.com/theApp , http://www.example3.com/theApp ETC 以便能够访问 API。 没有用户参与。大家可以去http://www.example.com/theApp并获得该网站的完整功能。 API 也是只读的,所以我们不关心 任何试图污染我们数据的人。

JavaScript Web 应用程序是使用 React.js 和 Node.js 服务器构建的。当然,SSL 将用于服务器和客户端之间的所有通信。

我认为行不通的事情:

  • 让用户登录使用http://www.example.com/theApp 。 (没有额外的登录功能,因此这只会惹恼用户。)
  • 在网络应用中存储密码/ token 。 (JavaScript 中没有任何东西是安全的,无论它多么令人困惑。)
  • 使 Web 应用程序客户端向身份验证服务器请求 token 。 (敌对客户也可以提出此请求。)
  • 将允许的 IP 列入白名单。 (每个人都可以访问这些网站...)
  • 将网址列入白名单。 (URL 作为 header 发送。 header 可以进行操作。)

可能有效的事情(或者至少是解决方案的一部分):

  • 让 Node.js 服务器应用代表客户端从身份验证服务器请求 token 。 (但我仍然不知道这将如何防止敌对客户做出 对 Node.js 服务器应用程序发出相同的请求)
  • 令人困惑。 (这可能会吓退大多数敌对的用户,但更持久(并且最熟练/危险?)的人只会对挑战感到兴奋 并且最终能够破解它。)

由于这是我们正在努力实现的相当复杂的事情,我开始相信这可能是不可能的,如果有人对该怎么做有一些建议,我将不胜感激。 如果给出充分的理由,“不要这样做”就是一个完美的答案。我在这里更多的是概念性解决方案,但如果有人想具体了解软件,我们有一个 包含 Node.js、Nginx 和 PHP 的 Linux 环境。

最佳答案

在所描述的场景中,混淆是唯一的选择。您希望让攻击者很难对您的 Web 客户端进行逆向工程。

如果客户端需要进行复杂的计算才能成功发出 API 请求,那么攻击者必须对该计算进行逆向工程并将其复制到另一个应用程序中。

一些有帮助的事情:

  • 精简的 JavaScript
  • 从服务器接收的 token (例如 CSRF token ),然后您可以在网络客户端代码中以某种方式对其进行哈希处理或转换
  • 在计算中包含当前日期

以上都无法阻止动机充分的攻击者。

关于javascript - 拥有公共(public) API,但只允许访问从我的网站发送的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589365/

相关文章:

javascript - 用 Javascript 中的单词数组拆分字符串

javascript - 如何调整 Jquery Mobile 中所有元素的大小以适应 iframe?

node.js - 替代 require.paths 以编程方式编辑需要搜索目录?

JSON.stringify 与序列化

java - 尝试从 REST 请求获取响应

javascript - JavaScript 中的日期差异

javascript - 如何在不使用重置按钮的情况下重置?

Android native 应用程序与跨平台应用程序

java - 将 JSON 转换为对象会引发 JsonMappingException "Can not deserialize instance of class out of START_ARRAY token"

rest - 如何使用 json 补丁更新集合