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

Posted

技术标签:

【中文标题】是否可以使用这些方法保护 API?【英文标题】:Is it possible to protect API with these methods? 【发布时间】:2016-09-05 13:52:49 【问题描述】:

到目前为止,我已经尝试过制作类似的东西:

    检查用户IP地址和主机 如果两者都匹配允许的主机和 IP,则允许访问 如果不是,则显示错误

我正在构建 API,到目前为止,所有请求都来自我的主机。这就是问题所在:

    如何让这些请求仅在来自本地主机时才被执行(很少应该只由指定主机执行,其余方法应该对公众可用) 如何防止人们欺骗referer和x-forwarded 有可能吗?

以下是一些代码:

设置 访问源头

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 了。

那么,有没有办法解决这个问题呢?

【问题讨论】:

如果您在请求中传递一些令牌以识别此类主机会更好 @siddhesh,是的,已经在使用它,但问题是,人们仍然可以复制令牌并使用它来绕过所谓的“安全” 您可以基于令牌时间表示,在特定时间令牌将更改 15 分钟或 1 天后,它不会是 100% 的解决方案,但如果有人仍然保留令牌,它会在一段时间后失效,从而减少黑客攻击 无论如何,来自“api 所在的同一系统”的 localhost 是什么意思 【参考方案1】:

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

【讨论】:

以上是关于是否可以使用这些方法保护 API?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用本地 AD 系统帐户通过身份验证过滤器保护 Web api?

我是否可以使用AAD保护REST API(在春季启动时说)并从该AAD以用户身份访问它

如何保护我在应用内进行的 REST 调用?

是否可以模拟受保护的属性和方法

有没有一种方法可以在不使用 APi 网关架构的情况下使用 Jwt 保护微服务端点

无需对移动应用进行用户身份验证即可保护私有 REST API 的最佳方法