如何在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网站这样的文件,则提供支持。它应该显示所有文件类型
答案 0 :(得分:7)
如果您正在使用LWP来获取图像,则可以查看HTTP服务器返回的content-type
标头。
WWW::Mechanize和LWP::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.png和https://stackoverflow.com/content/img/so/logo.gif都可以存在。它们不是在这种情况下,但在某些任意服务器上,您可以拥有多个具有相同基本名称但扩展名不同的图像。遗憾的是,通过提供其基本名称而无需循环可能性,无法获取远程Web目录中文件的可用扩展列表。