【问题标题】:is it possible to create a api which a particular website can access only and no other website can access it?是否可以创建一个特定网站只能访问而其他网站无法访问的api?
【发布时间】:2021-07-10 10:24:13
【问题描述】:

让我详细解释一下

我托管了 2 台服务器,其中一台用于后端,另一台用于前端。 后端服务器:127.0.0.1:8000(仅作说明) 前端服务器:127.1.1.1:9000

用户从前端服务器请求 UI,如果他想在我的网站上创建一个帐户,他需要向 127.0.0.1:8000/create-account/ 发送 POST 请求,这工作正常

但是如果我打开其他网站的控制台或使用 Postman,我可以达到同样的效果。 所以我想阻止这件事,只允许任何人从我的网站创建帐户。

我尝试过的方法

  1. 我已使用 windows.location() 并将其发送到服务器,然后验证域名是否匹配。但是在这种方法中,每个人都可以简单地通过 fetch() 传递它
  2. 我使用了只允许 IP 地址,但是如果我在生产环境中推送我的网站,其他访问者会收到 403 错误。

我在 Django 和 rustlang 的帮助下开发后端

【问题讨论】:

    标签: django api web server


    【解决方案1】:

    这是不可能的。您可以让入门级程序员难以对您的解决方案进行逆向工程,但如果您要允许从某些公共 UI 访问 API,则没有任何方法可以阻止对 API 的访问。

    基于 IP 地址的限制在这里不起作用,因为您的后端将收到用户的 IP。在这种情况下,您将阻止对用户的访问,而不是对任何 UI 的访问。即使主机标头验证在这里也不起作用,因为任何人都可以使用代理服务器(即 NGINX)来覆盖标头并可以伪造来自预期网站的请求。

    仅当 API 调用源自服务器并且您的 API 服务器接收到每个 API 调用的相同 IP 地址时,基于 IP 地址的授权才能工作。但对于您的用例,它不适用。

    像 CSRF 这样的旧技术也没有用,因为任何人都可以轻松检索令牌并发送它。简而言之,如果您将某些内容公开,则可以对其进行逆向工程。如果您接受公开注册,则无需担心注册来源。如果担心的话,您应该考虑使用电子邮件验证等解决方案来减少垃圾邮件。

    【讨论】:

    • Facebook 和 Google 等公司如何处理这种情况,因为我们无法使用他们的 API 将新用​​户注册到他们的服务器。所以我应该将注册页面路由到同一来源
    • 有大量的软件可以自动创建 Google 和 FB 帐户。正如我所说,如果任何东西对公众可见,都可以进行逆向工程。如果你做的事情正确,你可以注册一个用户。
    【解决方案2】:

    您可以让前端解决验证码并将解决方案发送到后端。在接受请求之前验证解决方案。还是可以绕过的,虽然难度有点大。

    【讨论】:

    • 是否不能让我的 API 仅通过 127.1.1.1:9000 访问,如果有人试图从 123.4.5.6:100 访问它,它会给他一个错误。
    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多