是否可以使用这些方法保护 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以用户身份访问它