【发布时间】: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 是什么意思
标签: php ajax api cross-domain