如何在URL中检测图像的文件类型?

时间:2009-07-14 12:20:13

标签: perl image url file

如何在Perl表单网站URL中找到图像文件类型?

例如,

$image_name = "logo";
$image_path = "http://stackoverflow.com/content/img/so/".$image_name 

从这些信息中如何找到那个文件类型。这里应该显示的例子

"png"

http://stackoverflow.com/content/img/so/logo.png . 

如果它有更多像SO网站这样的文件,则提供支持。它应该显示所有文件类型

5 个答案:

答案 0 :(得分:7)

如果您正在使用LWP来获取图像,则可以查看HTTP服务器返回的content-type标头。

WWW::MechanizeLWP::UserAgent都会为任何GET请求提供HTTP::Response个对象。所以你可以这样做:

use strict;
use warnings;

use WWW::Mechanize;

my $mech = WWW::Mechanize->new;
$mech->get( "http://stackoverflow.com/content/img/so/logo.png" );
my $type = $mech->response->headers->header( 'Content-Type' );

答案 1 :(得分:5)

你不能轻易说出来。 URL不一定反映图像的类型。

要获取图像类型,您必须通过HTTP(GET或更高效,HEAD)发出请求,并检查HTTP响应中的Content-type标头。

答案 2 :(得分:4)

好吧,https://stackoverflow.com/content/img/so/logo是404.如果不是,那么你可以使用

#!/usr/bin/perl

use strict;
use warnings;

use LWP::Simple;

my ($content_type) = head "https://stackoverflow.com/content/img/so/logo.png";

print "$content_type\n" if defined $content_type;

__END__

作为Kent Fredric points out,Web服务器告诉您的内容类型不一定与Web服务器发送的实际内容相匹配。请注意,File::MMagic也可能被愚弄。

#!/usr/bin/perl
use strict;
use warnings;

use File::MMagic;
use LWP::UserAgent;

my $mm = File::MMagic->new;

my $ua = LWP::UserAgent->new(
    max_size => 1_000 * 1_024,
);

my $res = $ua->get('https://stackoverflow.com/content/img/so/logo.png');

if ( $res->code eq '200' ) {
    print $mm->checktype_contents( $res->content );
}
else {
    print $res->status_line, "\n";
}
__END__

答案 3 :(得分:2)

您实际上无法根据网址或内容类型标头对内容进行假设。

他们只是指南发送的内容。

一个方便的技巧是混淆使用后缀匹配来识别文件类型的东西:

  http://example.com/someurl?q=foo#fakeheheh.png

如果您要随意允许将该图像添加到页面中,则在某些情况下,如果浏览器遵循它,则可能会成为某种攻击的门户。 (例如,http://really_awful_bank.example.com/transfer?amt=1000000;from=123;to=123

基于内容类型的伪造不是那么有害,但如果控制名称的人知道如何识别事物并为HEAD请求发送不同的内容类型,就像对GET请求那样,那么你可以做些讨厌的事情。

它可以告诉HEAD请求它是一个Image,但是然后告诉GET请求它的application/javascript和善良知道它将导致什么。

知道某些它是什么的唯一方法是下载文件然后进行基于MAGIC的识别或更多(即尝试解码图像)。然后,您需要担心的是图像太大,以及特殊制作的图像,这些图像可能会破坏尚未修补该漏洞的计算机中的漏洞。

以上所有都是极端偏执狂,但如果你知道罕见的可能性,你可以确保它们不会发生:)

答案 4 :(得分:1)

根据我的理解,您并不担心您已经知道名称+扩展名的图像的内容类型,您希望找到您知道基本名称的图像的扩展名。

为了做到这一点,你必须单独测试你想要的所有图像扩展,并存储哪些已解决,哪些没有。例如,https://stackoverflow.com/content/img/so/logo.pnghttps://stackoverflow.com/content/img/so/logo.gif都可以存在。它们不是在这种情况下,但在某些任意服务器上,您可以拥有多个具有相同基本名称但扩展名不同的图像。遗憾的是,通过提供其基本名称而无需循环可能性,无法获取远程Web目录中文件的可用扩展列表。