uri验证在Zend_Http_Client中真的很重要吗?

时间:2014-05-19 14:14:43

标签: php security url zend-framework web-crawler

我正在使用Zend_Http_Client(Zend Framework 1)从Web抓取一些数据。 在请求之前,Zend_Http_Client通过Zend_Uri :: validate()验证给定的URI。 Zend_Uri :: validate()中的验证规则非常严格,因此我无法获取大量页面。 例如

我试图将这个特殊字符添加到Zend_Uri规则中,但是有很多特殊字符,我宁愿在Zend_Uri中禁用整个验证过程。也许这样的解决方案并不优雅,但我不知道为什么Zend强迫我验证URI ......

我担心的是:如果我使用没有URI验证的zend_http_client来从未经验证的URI中获取html,那么它会不安全吗?

2 个答案:

答案 0 :(得分:1)

是的,你可以使用你自己的类来扩展 Zend_Http_Client

只需使用您自己的Uri对象并重新声明 setUri getUri 以及请求

标题主机:部分应该在选项中手动设置,我想如果在标题数组中设置了这个标题,则不需要Zend_Uri。

但也许你没有以正确的方式使用Zend_Uri或Zend_Client_Http。

作为无效的Zend_Uri根本无效。

您可以尝试在浏览器从浏览器地址栏向服务器发送网址时执行相同的操作, urlencode 网址

因此,像这样的符号将成为:

http://www.investing.com/.../euro-banknotes-%E2%82%AC-a-means-of-payment-recognised-worldwide-213287

符号将成为编码值%E2%82%AC

今天的大多数浏览器都不会更改网址,因为大多数用户都不会理解为什么他们的网址会发生变化。

有些疯狂的浏览器只会在浏览器地址栏中显示网页域名,例如移动版游戏或Chrome。

尝试在将网址发送到Zend_Http_Client之前对你的网址进行urlencode,我猜你对Zend_Uri的有效Uri实例会很好!

$url = urlencode($url);

$client = new Zend_Http_Client($url);

$response = $client->request(Zend_Http_Client::GET);

玩得开心!

答案 1 :(得分:0)

让我们首先看看您将网址字符串传递给Zend_Http_Client时发生了什么:

  1. Zend_Http_Client :: __ construct()将URL传递给Zend_Http_Client :: setUri()
  2. Zend_Http_Client :: setUri()将URL传递给Zend_Uri :: factory()
  3. Zend_Uri :: factory()调用Zend_Uri_Http :: __ construct()
  4. Zend_Uri_Http :: __ construct()调用Zend_Uri_Http :: valid()
  5. Zend_Uri_Http :: valid()调用多个Zend_Uri_Http :: validate *()方法
  6. 但是,将Zend_Uri_Http的实例传递给Zend_Http_Client将导致setUri()克隆并使用它,因此可以通过创建URI类并将其实例传递给Zend_Http_Client来跳过Zend_Uri的验证

    创建一个扩展Zend_Uri_Http的URI类,并覆盖您的情况所需的属性和方法(但不包括常量,下面更多):

    class My_Uri_Http extends Zend_Uri_Http
    {
        public function valid()
        {
            return TRUE;
        }
    
        // or
    
        public function validatePath($path = null)
        {
            $this->_regex['path'] = '...';
            return parent::validatePath($path);
        }
    }
    

    然后告诉Zend_Uri :: factory()使用你的类并将结果(扩展名为My_Uri_Http和Zend_Uri_Http的实例)传递给Zend_Http_Client:

    $uri = Zend_Uri::factory($url, 'My_Uri_Http');
    
    $client = new Zend_Http_Client($uri);
    

    为什么不是常数?

    Zend_Uri_Http :: __ construct()使用self :: CONSTANT来创建它在validate *()方法中使用的正则表达式。在My_Uri_Http中覆盖这些常量将无效,因为self ::引用了Zend_Uri_Http。 (如果改为使用static ::,你可以在子类中写出常量。)