【问题标题】:Private REST API私有 REST API
【发布时间】:2012-04-09 15:15:15
【问题描述】:

我们有 REST API,我们希望只有我们的域可以访问并且不发送欺骗性请求。为此,我唯一想到的就是检查推荐人$_SERVER['HTTP_REFERER']。不过docs say that:

将用户代理引至 当前页面。这是由用户代理设置的。 并非所有用户代理都会 设置这个,有些提供修改 HTTP_REFERER 作为 特征。简而言之,它不能真正被信任。

假设我们的主要 API 请求/门文件是:

www.example.com/api/gate.php

如何确保它的安全,以便只处理来自自己域的请求而忽略所有其他请求。我已经阅读了一些关于 http 身份验证和设置私钥或秘密的内容,但我正在寻找一种简单的方法,这样只有我们自己的域才能向该文件发送请求。谢谢

【问题讨论】:

    标签: php api rest


    【解决方案1】:

    如前所述,HTTP_REFERRERREMOTE_ADDR 可能被欺骗,因此不能被信任来实现所述功能。另请注意,在共享主机环境中,同一服务器中的其他帐户也具有相同的 IP。

    一个快速的解决方案是使用Basic Authentication 来验证对 API 的请求。这不会按 IP 或引用 URL/IP 进行过滤,但会确保请求来自受信任的来源。

    在 Apache 环境中设置基本身份验证就像创建 .htaccess.htpasswd 文件并将它们放在 API 的根目录中一样简单。

    您可以使用以下生成器创建这两个文件:
    .htaccess generator
    .htpasswd generator

    设置基本身份验证后,在 PHP 中验证您的请求就像通过以下方式访问您的 API 一样简单:

    username:password@example.com

    因此,无需开发额外的代码来设置任何标头来验证您的请求。任何访问该 URL 的人都会被提示输入凭据,如果身份验证失败则拒绝访问。

    【讨论】:

      【解决方案2】:

      我相信HTTP_REFERRERREMOTE_ADDR 只是在请求标头中发送,这意味着它们可以被欺骗。如果您的网站在 Internet 上,并且您想限制对其的访问,那么这不是这样做的方法。必须使用凭据进行完整身份验证。

      如果您不想设置身份验证或密钥,您可以将其托管在您公司的 LAN 上。

      【讨论】:

      • 同意。设置基本身份验证只需要几分钟,并且可以使用username:password@example.com直接在 URL 中完成身份验证
      • @TelmoMarques:任何人都无法在 url 中看到这些凭据,然后发送欺骗性请求
      • @Dev555 我的意思是可以直接在 URL 中进行身份验证,这意味着不需要开发额外的代码来验证请求。在没有任何凭据的情况下访问 URL 只会提示用户提供它们,如果身份验证失败则拒绝访问。
      【解决方案3】:

      public_html/api 子文件夹中允许访问本地主机的简单 .htaccess 不能解决问题吗?

      order deny,allow
      deny from all
      allow from 127.0.0.1
      

      或者,如果您只访问 gate.php 文件并且需要文件夹中的其他文件可以访问,您可以只针对一个文件

      <files "gate.php">
          order deny,allow
          deny from all
          allow from 127.0.0.1
      </files>
      

      【讨论】:

      • 在共享主机上下文中,同一服务器中的其他帐户也是 "localhost"
      【解决方案4】:

      还有 $_SERVER['REMOTE_ADDR'] 不太可能被欺骗。

      Is it safe to trust $_SERVER['REMOTE_ADDR']?

      【讨论】:

      • 在其他答案中提到它也可以被欺骗:(
      • 请记住,在共享托管服务中,其他帐户具有相同的 IP 地址。
      猜你喜欢
      • 1970-01-01
      • 2014-09-27
      • 2012-03-06
      • 2017-03-24
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      相关资源
      最近更新 更多