到目前为止,我试图做出类似的事情:
我正在构建API,到目前为止,所有请求都来自我的主机。这是问题所在:
以下是一些代码:
设置 访问来源标题
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 了。
那么,这个问题是否有任何可能的解决方案?
答案 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