Php 有可能用这些方法保护API吗?

Php 有可能用这些方法保护API吗?,php,ajax,api,cross-domain,Php,Ajax,Api,Cross Domain,到目前为止,我试着做一些类似的事情: 检查用户的IP地址和主机 如果两者都匹配允许的主机和IP,则允许访问 如果否,则显示错误 我正在构建API,到目前为止,所有请求都只来自我的主机。问题是: 如何允许仅当这些请求来自本地主机时才执行它们(只有少数几个请求应该由指定的主机执行,其余的方法应该对公众可用) 如何防止人们欺骗referer和x-forwarded 有可能吗 以下是一些代码: 设置访问原始标题 检查请求来源 除了一件事之外,一切都可能是完美的:我正在运行CloudFlare,显然我不能

到目前为止,我试着做一些类似的事情:

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

  • 如何允许仅当这些请求来自本地主机时才执行它们(只有少数几个请求应该由指定的主机执行,其余的方法应该对公众可用)
  • 如何防止人们欺骗referer和x-forwarded
  • 有可能吗
  • 以下是一些代码:

    设置访问原始标题

    检查请求来源

    除了一件事之外,一切都可能是完美的:我正在运行CloudFlare,显然我不能再检查远程地址了


    那么,这个问题有什么可能的解决方案吗?

    Cloudflare发送了几个变量

    $\u服务器[“HTTP\u CF\u CONNECTING\u IP”]提供客户端(访问者)IP地址

    $\u服务器[“HTTP\u CF\u IPCOUNTRY”]提供访问国家/地区

    $\u服务器[“HTTP\u CF\u访问者”]显示用于连接的方案-HTTP或HTTPS

    $\u SERVER[“HTTP\u CF\u-RAY”]传递CF-RAY头,其中包含一个附加了请求通过的数据中心的哈希

    您还可以使用$_SERVER['HTTP_X_FORWARDED_FOR']这是一个由代理(包括CloudFlare)使用的完善的HTTP头,用于在请求中传递其他IP地址


    更多

    如果您将一些令牌与您的请求一起传递,以识别此类host@siddhesh是的,已经在用了,但问题是,人们仍然可以复制令牌并使用它来绕过所谓的“安全性”。您可以在特定时间后创建基于时间的令牌。令牌将更改,例如15分钟或1天。这不是100%的解决方案,但会减少黑客攻击。如果有人静止令牌,它将在一段时间后无效。无论如何,您所说的“同一系统中的本地主机”是什么意思居住
    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;
        }