【问题标题】:Get PHP page content only from specific server with Zend\Http\Client and Curl使用 Zend\Http\Client 和 Curl 仅从特定服务器获取 PHP 页面内容
【发布时间】:2017-06-28 11:41:46
【问题描述】:

如何保护 php 页面的内容以仅通过特定服务器的 curl 请求访问它?使用“https://cms.domain.com/home”之类的请求应该无法在浏览器中获取内容,但如果我在特定服务器上创建 Zend 客户端,则应该可以获取内容。

是否可以检查referer或其他?

$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();

【问题讨论】:

    标签: php curl zend-framework zend-framework2


    【解决方案1】:

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

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

    您可以在以下位置找到更多信息:

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

    【讨论】:

      【解决方案2】:

      如果你找到一条捷径,我会说不!

      唯一可靠的解决方案是使用 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,它非常有用。请查看他们的文档以了解实施情况!

      【讨论】:

        【解决方案3】:

        您可以在 HTTP 请求 上检查 User Agent。这里是 cURL 用户代理的例子:curl/7.37.0

        所以,如果用户代理不是curl/*,你可以在onBootstrap(MvcEvent $mvcEvent)查看,请求将被拒绝。

        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;
                }
        
            }
        }
        

        如果你愿意,你可以添加一些类似安全令牌以更好地限制。

        【讨论】:

        • 老实说,如果我是客户,或者你是客户,我们知道 API 的端点怎么办。我们可以从任何地方发出 curl 请求来访问那种类型的端点吗?所以它对所有人开放,不是吗?
        • 是的,它已经打开了。我的回答是基于这个问题。但是,我也建议使用安全令牌进行限制。
        猜你喜欢
        • 2020-08-09
        • 1970-01-01
        • 2022-08-10
        • 2010-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多