Как я могу определить тип файла изображения по URL? - PullRequest
0 голосов
/ 14 июля 2009

Как найти тип файла изображения в URL веб-сайта формы Perl?

Например,

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

Из этой информации, как найти тип файла, который. вот пример, он должен отображать

"png"

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

Supposer, если у него есть больше файлов, таких как веб-сайт SO. он должен показывать все типы файлов

Ответы [ 5 ]

7 голосов
/ 14 июля 2009

Если вы используете LWP для извлечения изображения, вы можете посмотреть заголовок content-type, возвращаемый HTTP-сервером.

Оба WWW :: Mechanize и LWP :: UserAgent предоставят вам объект HTTP :: Response для любого запроса GET. Таким образом, вы можете сделать что-то вроде:

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' );
5 голосов
/ 14 июля 2009

Вы не можете легко сказать. URL не обязательно отражает тип изображения.

Чтобы получить тип изображения, вы должны сделать запрос через HTTP (GET или, что более эффективно, HEAD) и проверить заголовок Content-type в ответе HTTP.

4 голосов
/ 14 июля 2009

Ну, 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__

Поскольку Кент Фредрик указывает , то, что веб-сервер сообщает вам о типе контента, не обязательно должно соответствовать фактическому контенту, отправляемому веб-сервером. Имейте в виду, что 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__
2 голосов
/ 14 июля 2009

Вы действительно не можете делать предположения о контенте, основанном на 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 голос
/ 14 июля 2009

Насколько я понимаю, вас не беспокоит тип содержимого изображения, для которого вы уже знаете имя + расширение, вы хотите найти расширение для изображения, базовое имя которого вы знаете.

Чтобы сделать это, вам нужно протестировать все расширения изображений, которые вы хотели по отдельности, и сохранить, какие из них разрешены, а какие нет. Например, могут существовать https://stackoverflow.com/content/img/so/logo.png и https://stackoverflow.com/content/img/so/logo.gif. Они не в этой конкретной ситуации, но на каком-то произвольном сервере вы можете иметь несколько изображений с одинаковым базовым именем, но с разными расширениями. К сожалению, нет способа получить список доступных расширений файла в удаленном веб-каталоге, указав его базовое имя, не просматривая возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...