仅使用Zend \ Http \ Client和Curl从特定服务器获取PHP页面内容

时间:2017-06-28 11:41:46

标签: php curl zend-framework zend-framework2

如何保护php页面的内容只能通过特定服务器的curl请求来访问它?不应该在浏览器中使用" https://cms.domain.com/home"等请求获取内容,但如果我在特定服务器上创建Zend Client,则应该可以获取内容。

是否可以检查引用者或其他内容?

$adapter = new Zend\Http\Client\Adapter\Curl();
$client = new Zend\Http\Client();
$client->setAdapter($adapter);

$client->setMethod(\Zend\Http\Request::METHOD_GET)
    ->setUri('https://cms.domain.com/home');

$response = $this->client->send();

3 个答案:

答案 0 :(得分:0)

它不是那么简单,因为根据HTTP协议请求是定义独立于其他请求。

HTTP_REFERER很容易伪造,并不总是存在。

您可以在以下网址找到更多信息:

How to check if a request if coming from the same server or different server?

答案 1 :(得分:0)

如果你找到一个简短的方法,我会说不!

唯一可靠的解决方案是使用 OAuth2 协议来限制您的API https://cms.domain.com/home。因为Google,Facebook,Twitter使用OAuth2作为他们的API。

因此,您需要创建一个RESTful应用程序。典型的RESTful Web服务将使用HTTP来执行四个CRUD(创建,检索,更新和删除)操作。这意味着您可以将这四个操作操作到api的不同端点,例如https://cms.domain.com/v2/api/oauthhttps://cms.domain.com/v2/api/etc

当您使用Zend\Http\Client作为客户端来处理您的api时,您需要一台服务器进行身份验证,即OAuth2服务器。在这里,您可以获得Brent Shaffer的OAuth2 Server Library for PHP

您也可以使用OAuth2 server from php league

另一个选项是Zend Framework的Apigility,如果您需要启动并运行OAuth 2.0 API,这非常有用。请查看他们的实施文档!

答案 2 :(得分:0)

您可以在 HTTP请求上查看用户代理。这里是cURL用户代理的示例: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;
        }

    }
}

如果需要,可以添加一些类似安全令牌的内容,以便更好地进行限制。