如何仅使用特定服务器的卷曲请求来保护PHP页面的内容?不应该在浏览器中获取内容,并使用诸如" https://cms.domain.com/home"之类的请求获取内容,但是如果我在特定服务器上创建Zend客户端,则应该可以获取内容。
可以检查参考器还是其他?
$adapter = new ZendHttpClientAdapterCurl();
$client = new ZendHttpClient();
$client->setAdapter($adapter);
$client->setMethod(ZendHttpRequest::METHOD_GET)
->setUri('https://cms.domain.com/home');
$response = $this->client->send();
这不是那么简单,因为根据http协议,请求与其他请求无关。
http_referer易于伪造,并且并非总是存在。
您可以找到的更多信息:
如何检查是否来自同一服务器或其他服务器的请求?
如果您找到了短时间,我会说不!
唯一可靠的解决方案是使用 oauth2 协议限制您的API https://cms.domain.com/home
。因为Google,Facebook,Twitter将OAuth2用于其API。
因此,您需要创建一个RESTFUL应用程序。典型的Restful Web服务将使用HTTP进行四个CRUD(创建,检索,更新和删除(操作。表示您可以将这四个操作操作到API的不同端点,例如https://cms.domain.com/v2/api/oauth
,https://cms.domain.com/v2/api/etc
。
当您使用ZendHttpClient
作为客户端来处理API时,您需要一台用于身份验证的服务器,即OAuth2服务器。在这里,您可以获取Brent Shaffer的PHP的OAuth2服务器库。
您也可以使用PHP联赛中的OAuth2服务器。
另一个选项是Zend Framework的掌管,如果您需要启动和运行OAuth 2.0 API,则非常有用。请查看他们的文档以进行实施!
您可以在 http request 上检查用户代理。这里是卷曲用户代理的示例: curl/7.37.0
。
因此,您可以在onBootstrap(MvcEvent $mvcEvent)
上检查使用用户代理不是curl/*
,请求将被拒绝。
class Module
{
public function onBootstrap(MvcEvent $event)
{
$headers = $event->getRequest()->getHeaders();
$userAgent = $headers->get('User-Agent');
if (is_null($userAgent) || preg_match("/^curl/.*/", $userAgent->getFieldValue() !== 1) {
$response = $this->getResponse();
$response->setStatusCode(400); // give bad request status
$response->sendHeaders();
$stopCallBack = function($mvcEvent) use ($response){
$mvcEvent->stopPropagation();
return $response;
};
//Attach the "break" as a listener with a high priority
$event->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, $stopCallBack,-10000);
return $response;
}
}
}
如果需要,可以添加一些像安全令牌以使限制更好。