是否可以使用这些方法保护API?

时间:2016-05-10 14:10:48

标签: php ajax api cross-domain

到目前为止,我试图做出类似的事情:

  1. 检查用户的IP地址和主机
  2. 如果两者都匹配允许主持人和IP,允许访问
  3. 如果否,则显示错误
  4. 我正在构建API,到目前为止,所有请求都来自我的主机。这是问题所在:

    1. 如果这些请求来自本地主机(只有少数应该只由指定的主机执行,其他方法应该可供公众使用),如何允许执行这些请求。
    2. 如何防止人们欺骗引用者和x-forwarded
    3. 有可能吗?
    4. 以下是一些代码:

      设置 访问来源标题

      if(isset($_SERVER['HTTP_REFERER'])) {
              $refererProtocol = str_replace(':', '', substr($_SERVER['HTTP_REFERER'], 0, strpos($_SERVER['HTTP_REFERER'], "/")));
              $refererHost = str_replace($refererProtocol . '://', '', $_SERVER['HTTP_REFERER']);
              $ACAO = $refererProtocol . '://' . substr($refererHost, 0, strpos($refererHost, "/"));
              $this->accessControl = [
                  'allow_origin'  =>  $ACAO,
                  'from_referer'  =>  true
              ];
              header("Access-Control-Allow-Origin: " . $ACAO);
          } else {
              $this->accessControl = [
                  'allow_origin'  =>  'https://' . $_SERVER['HTTP_HOST'],
                  'from_referer'  =>  false
              ];
              header("Access-Control-Allow-Origin: " . 'https://' . $_SERVER['HTTP_HOST']);
          }
      

      检查 请求来源

      $localHost = 'https://' . $_SERVER['SERVER_NAME'];
      
          if ($this->accessControl['allow_origin'] === $localHost || $this->accessControl['allow_origin'] === $this->Settings['allow_host']) {
              if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                  $this->JSON->apiError(403, 'You are not allowed to execute this method', ['MyAPI', 'onlyLocalHost']);
                  return false;
              } else {
                  if ($this->Settings['allow_ip'] === $_SERVER['REMOTE_ADDR']) {
                      return true;
                  } else {
                      $this->JSON->apiError(403, 'You are not allowed to execute this method', ['MyAPI', 'onlyLocalHost']);
                      return false;
                  }
              }
          } else {
              $this->JSON->apiError(403, 'You are not allowed to execute this method', ['MyAPI', 'onlyLocalHost']);
              return false;
          }
      

      除了一件事,一切都可能是完美的:我正在运行CloudFlare,显然我再也无法检查 REMOTE_ADDR 了。

      那么,这个问题是否有任何可能的解决方案?

1 个答案:

答案 0 :(得分:2)

Cloudflare发送了少量变量

$ _ SERVER [“HTTP_CF_CONNECTING_IP”]提供客户端(访客)IP地址。

$ _ SERVER [“HTTP_CF_IPCOUNTRY”]提供访问者的国家。

$ _ SERVER [“HTTP_CF_VISITOR”]显示用于连接的方案 - HTTP或HTTPS。

$ _ SERVER [“HTTP_CF_RAY”]传递CF-Ray标头,其中包含附加了请求所通过的数据中心的散列。

你也可以使用$ _SERVER ['HTTP_X_FORWARDED_FOR']这是一个完善的HTTP头,代理人使用它来包括CloudFlare,以传递请求中的其他IP地址。

更多https://support.cloudflare.com/hc/en-us/articles/200170986