【问题标题】:How do I hide a REST API Url from the end user?如何向最终用户隐藏 REST API Url?
【发布时间】:2021-01-06 14:35:20
【问题描述】:

是否可以隐藏我通过 AJAX 用于填充页面数据的 REST URL?我不希望其他人从我的 REST API 中获取和消费,但需要使用它在我的网站中显示内容。

如何对最终用户隐藏我的 REST API URL?

【问题讨论】:

  • 不,不是。即使您在代码中很好地掩盖了它,该人也可以简单地检查请求选项卡以查看调用的 url。
  • 不,无法隐藏该 url - 但您可以使用 url-shortener 来“混淆”它。如果用户不应该知道该网站的内容,请使用其他机制,例如登录

标签: javascript rest


【解决方案1】:

无法在 JavaScript 中对最终用户隐藏 URL。他们可以简单地在 Chrome 中打开网络面板,或者只需打开 Fiddler 即可查看。

在您的特定情况下,您可以向用户隐藏 URL 的唯一真正方法是从您的服务器端代码代理对 API 的 REST 调用。

如果您必须使用 JavaScript,您始终可以创建和使用 APIKey,并简单地监控其使用情况并终止占用过多带宽的 API Key;但同样——这不会阻止某人使用您的 API,它只会在您从意想不到的地方收到意想不到的流量时通知您。

您可以通过每天循环使用 API 密钥来更进一步,所以如果有人想使用您的 API;他们必须每天更改代码 - 但同样,这不会阻止某人,只会减慢他们的速度。

唯一的完全验证方式是我在第一段中提到的方式——但这不能仅通过客户端 JavaScript 完成。

单页应用时代的更新

我写的内容是正确的,即使对于单页应用程序 (SPA);虽然您可以通过为客户端应用程序设置与服务器呈现页面不同的路由来隐藏 地址栏中的 URL

用户仍然可以在浏览器的控制台中检查流量以检查请求的去向(无法绕过),但您至少可以在地址栏中显示不同的路径。

【讨论】:

  • 谢谢大家。我猜想从 REST 获取 JSON 数据的目的证明了公开 URL 的方法。
【解决方案2】:

不是真的。 该页面需要访问该 URL 才能使用它,这让您陷入了一个古老的问题,即向某人展示某些东西同时对他们隐藏它。带有内置调试工具的现代浏览器使问题更加复杂:即使您对 URL 进行了加密,您也必须将其解密才能使用它,而调试器可以在此时介入。

您担心其他人使用该 API 是否有特别的原因?确实没有办法阻止其他人找到该 URL,但可能还有其他方法可以实现您的目标。

【讨论】:

    【解决方案3】:

    不可能对任何有动机和决心找到该网址的人隐藏该网址。不建议通过默默无闻地依赖安全性,通过 REST 暴露的所有内容都应被视为潜在漏洞,并在服务器端进行所有必要的安全检查。像对待公共网页一样对待所有 REST API。

    【讨论】:

      【解决方案4】:

      通过隐藏我假设您的意思是与您的 Javascript 中显示的 URL 没有任何关联。不幸的是,据我所知,无法隐藏 URL,即使您设法将其隐藏在 javascript 中,该请求也会在任何能够在网页上接收传出和传入 http 请求的扩展程序中可见。

      【讨论】:

        【解决方案5】:

        不是发送json数据请求,而是在api调用中发送整个html渲染数据的请求。通过这种方式隐藏 json 数据也将得到管理,页面的渲染时间也将加快。客户端不需要json数据调用。

        【讨论】:

        • 这对黑客来说也比结构化 json 更难解析
        【解决方案6】:

        尝试在服务器端渲染 HTML(如果您认为自己的服务器容量很高)。如果 HTML 是预渲染的,API 调用对最终用户是不可见的。

        如果您正在使用:

        1. 反应 - https://www.freecodecamp.org/news/server-side-rendering-your-react-app-in-three-simple-steps-7a82b95db82e/

        2. Angular - https://angular.io/guide/universal

        像 Django 这样的框架默认做服务器端渲染。

        -> 与客户端渲染相比,服务器端渲染可能会导致服务器负载。

        【讨论】:

          【解决方案7】:

          是的,也许对隐藏 api 有不同的解释,但确实隐藏了它以防止直接访问。我想这就是隐藏它的重点。

          您可以通过您的网络服务器进行操作。我正在使用 Nginx。我有一个检查 $http_referer 的 if 语句。如果没有,或者不是我的应用程序/前端页面创建的(意味着有人试图直接点击 api),它将返回一个 403 禁止页面。

          如果您的应用程序不向您的用户发送电子邮件,请不要担心以下问题:我添加了一个块以允许访问我的静态图像作为唯一的例外,因为我的应用程序发送带有图像的电子邮件而我没有不想让它们坏掉。

          就是这样。问题解决了。除了我的前端页面/应用程序之外,没有人可以访问我的 api。

          所以是的,这个 api 对用户是隐藏的,因为他们可以尝试点击它,但他们将无法进入。

          【讨论】:

            猜你喜欢
            • 2016-09-02
            • 2014-04-04
            • 1970-01-01
            • 1970-01-01
            • 2021-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多