2009-07-14 57 views
0

如何在Perl表單網站URL中找到圖像文件類型?如何在URL中檢測圖像的文件類型?

例如,

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

從這些信息中如何找到文件類型。這裏的例子應該顯示

"png"

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

Supposer,如果有更多的文件,像這樣的網站。它應該顯示所有文件類型

+2

請告訴您是否想了解基於文件的內容或基於任何謊言Web服務器告訴客戶端類型。 – hillu 2009-07-14 12:36:46

+0

它基於類型的內容 – joe 2009-07-14 14:40:12

+0

僅供參考:我已將代碼添加到我的答案中,以根據內容檢測類型。 – 2009-07-14 15:35:27

回答

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__ 
5

你不能輕易說出。該URL不一定反映圖像的類型。

要獲取圖像類型,您必須通過HTTP(GET,或更高效,HEAD)發出請求,並檢查HTTP響應中的Content-type標頭。

+0

它只是應用程序,而不是像上面的Web – joe 2009-07-14 13:28:58

+1

時到底發生了什麼與您已標記爲實現您的要求:-) – 2009-07-14 13:42:34

7

如果您使用LWP來獲取圖像,你可以看看由HTTP服務器返回的content-type頭。

對於任何GET請求,WWW::MechanizeLWP::UserAgent都會給你一個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'); 
2

你真的無法對基於URL甚至內容類型標頭的內容做出假設。

他們只是指南什麼是發送。在一些

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

如果你是任意允許該圖像將被添加到頁面中,它可能:

一個方便的技巧混淆使用後綴匹配來識別文件類型的事情是這樣做的如果瀏覽器跟蹤了這些情況,那麼這些案件就成了某種攻擊的入口。 (例如,http://really_awful_bank.example.com/transfer?amt=1000000;from=123;to=123

基於內容類型的僞造並非如此有害,但如果控制名稱的人知道如何識別事物併爲HEAD請求發送不同的內容類型,那麼您可以做出令人厭惡的事情GET請求。

它可以告訴HEAD請求它是一個圖像,但然後告訴GET請求它的一個application/javascript和善良知道這將導致。

知道某些的唯一方法是下載文件,然後進行基於MAGIC的識別或更多(即嘗試解碼圖像)。然後,您必須擔心的是太大的圖像,以及特製的圖像,這些圖像可能會影響尚未針對該漏洞進行修補的計算機中的漏洞。

授予的一切的上面是極端偏執,但如果你知道了難得的機會,你可以確保他們不能發生:)

1

從我瞭解你不擔心內容類型你已經知道名稱+擴展名的圖像,你想找到一個你知道其基本名稱的圖像的擴展名。

爲了做到這一點你必須要測試你想單獨哪些解決了,哪些沒有全部圖像擴展和商店。例如https://stackoverflow.com/content/img/so/logo.pnghttps://stackoverflow.com/content/img/so/logo.gif都可能存在。他們沒有在這種確切的情況下,但在一些任意的服務器上,您可以擁有多個具有相同基本名稱但擴展名不同的圖像。不幸的是,沒有辦法通過提供其基本名稱而無需循環遍歷可能性來獲得遠程Web目錄中文件的可用擴展名列表。