【问题标题】:how to check if a url is an image url with php?如何检查一个url是否是一个带有php的图像url?
【发布时间】:2011-03-26 21:46:12
【问题描述】:

【问题讨论】:

标签: php image validation url filenames


【解决方案1】:

如果您想绝对确定,并且您的 PHP 已启用远程连接,您可以使用

getimagesize('url');

如果它返回一个数组,则它是 PHP 识别的图像类型,即使图像扩展名不在 url 中(根据您的第二个链接)。您必须记住,此方法将为每个请求建立一个远程连接,因此可能会缓存您已经在数据库中探测的 url 以降低连接。

【讨论】:

  • 如果您这样做,请务必清理 URL!或者更好的是,使用curl,它不能(不应该?)访问文件系统。
  • 这不会执行突击队,它会打开文件并读取文件的标题。如果有人说 /etc/passwd 作为链接,你能解释一下危险在哪里吗?该函数只会返回 FALSE。
  • 这仍然存在安全风险。如果getimagesize 包含错误怎么办?如果@Giffary 决定从图像中获取更多信息,这会为潜在的黑客提供更多信息怎么办?我不知道,但 IMO 安全总比抱歉好。
  • @Strager 我完全同意安全胜于抱歉,留下安全漏洞太容易了。我只是想知道您发表该声明是否有特殊原因。
【解决方案2】:

您可以向服务器发送HEAD request,然后检查内容类型。这样你至少知道服务器“认为”什么类型是什么。

【讨论】:

    【解决方案3】:

    您可以使用下面的 getimagesize 函数检查 url 是否为图像。

    function validImage($file) {
       $size = getimagesize($file);
       return (strtolower(substr($size['mime'], 0, 5)) == 'image' ? true : false);  
    }
    
    $image = validImage('http://www.example.com/image.jpg');
    echo 'this image ' . ($image ? ' is' : ' is not') . ' an image file.';
    

    【讨论】:

    • 我第一次看到 ['mime']。你知道我可以在某个地方了解更多关于它是什么和做什么的吗?
    • @TrevorW 我认为getimagesize函数页面上应该有一些关于它的信息php.net/manual/en/function.getimagesize.php
    • 可悲的是,有时扩展是谎言:'(
    【解决方案4】:

    我认为这个想法是通过 curl 获取标题 url 的内容

    并检查标题

    调用curl_exec()获取网页后,调用curl_getinfo()从HTTP头中获取内容类型字符串

    在此链接中查看如何操作:

    http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_content_type#IfyouareusingCURL

    【讨论】:

    • 其他方法的好链接!
    【解决方案5】:

    可以用这个:

    $is = @getimagesize ($link);
    if ( !$is ) $link='';
    elseif ( !in_array($is[2], array(1,2,3))   ) $link='';
    elseif ( ($is['bits']>=8) ) $srcs[] = $link;
    

    【讨论】:

      【解决方案6】:

      这是一种需要 curl 的方法,但比 getimagesize 更快,因为它不会下载整个图像。 免责声明:它检查标题,它们并不总是正确的。

      function is_url_image($url){
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $url );
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
              curl_setopt($ch, CURLOPT_HEADER, 1);
              curl_setopt($ch, CURLOPT_NOBODY, 1);
              $output = curl_exec($ch);
              curl_close($ch);
      
              $headers = array();
              foreach(explode("\n",$output) as $line){
                  $parts = explode(':' ,$line);
                  if(count($parts) == 2){
                      $headers[trim($parts[0])] = trim($parts[1]);
                  }
      
              }
      
              return isset($headers["Content-Type"]) && strpos($headers['Content-Type'], 'image/') === 0;
          }
      

      【讨论】:

        【解决方案7】:
        $ext = strtolower(end(explode('.', $filename)));
        switch($ext)
        {
        case 'jpg':
        ///Blah
        break;
        }
        

        硬版(只是尝试)

        //Turn off E_NOTICE reporting first
        if(getimagesize($url) !== false)
        {
        //Image
        }
        

        【讨论】:

        • Turn off E_NOTICE reporting first 如果有必要,为什么不使用@ 运算符?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多