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

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

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

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

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

以下是一些代码:

设置 访问源头

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 是什么意思

标签: php ajax api cross-domain


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2012-10-13
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多