仅从Zend http client和Curl中获取特定服务器中的PHP页面内容



如何仅使用特定服务器的卷曲请求来保护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/oauthhttps://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;
        }
    }
}

如果需要,可以添加一些像安全令牌以使限制更好。

相关内容

最新更新