Определение CMS средствами Perl
14 ноября 2009
Недавно написал несколько скриптов, позволяющих автоматически определять, какая CMS (Content Management System, система управления контентом) используется на сайте. Вот решил выложить на всеобщее обозрение.
В архиве вы найдете четыре скрипта, каждый для своей CMS — Drupal, Joomla, WordPress и TextPattern. Рассмотрю устройство одного из них, поскольку все работают по одному принципу.
# iswp.pl script
# (c) Alexandr A Alexeev 2009 | http://eax.me/
use strict;
my $dn = shift;
print "Invalid domain name\n" and exit 1
unless($dn =~ /^[a-z0-9\.\-]+$/);
my $data = `wget -q $dn -O -`;
print "Download failed: $?\n" and exit 2 if($?);
my $cnt = 0;
$cnt ++ if($data =~ /UTF\-8/gi);
$cnt ++ if($data =~ /\/wp\-content\/themes\//gi);
$cnt ++ if($data =~ /\/wp\-content\/plugins\//gi);
$cnt ++ if($data =~ /WordPress/gi);
$cnt ++ if($data =~ /\/wp\-includes\//);
$cnt ++ if($data =~ /\/xmlrpc\.php/);
$cnt = int $cnt * 100 / 6;
print "WordPress:$cnt\n";
Как видите, все очень просто — скрипт принимает в качества аргумента доменное имя, обращается к соответствующему сайту с помощью wget, затем ищет в HTML-коде сигнатуры WordPress’а. Чем больше сигнатур найдено, тем больше вероятность, что данный сайт работает на WordPress.
Я писал скрипты так, что если найдено больше половины сигнатур (вероятность больше 50%), можно быть почти уверенными, что CMS опознана. Так что выводимое скриптом число не следует воспринимать чисто как вероятность.
Можно увеличить точность определения, если для каждого сайта вызывать каждый скрипт. Например, если для какого-то сайта iswp.pl вернул 50%, а isdrupal.pl и остальные вернули 30% или меньше, значит мы точно имеем дело с WordPress. Если же несколько скриптов вернули большое (больше 50%) значение, значит CMS не опознана.
Приведенные скрипты имеют несколько существенных, на мой взгляд, недостатков. Во-первых, и это не сложно исправить, HTML-код не кэшируется. Это может создать большие проблемы при массовом определении движков. Что, если мне захочется узнать статистику используемых CMS, скажем, по всему рунету?
Во-вторых, мы не определяем версию CMS. В ряде случаев это не сложно сделать, например WordPress вставляет в HTML-код соответствующий meta-тег:
Другие CMS часто пишут свою версию в подвале (footer) страницы. Но на мой взгляд, это — задача уже других скриптов, которые следует использовать уже после того, как CMS была определена.
В-третьих, мы производим анализ сайта только по одной, главной странице. Встречаются сайты, главная страница которых просто содержит приветственное сообщение, на них с помощью моих скриптов ничего обнаружить не удастся. На сайте может быть использовано несколько CMS. Кроме того, анализ нескольких страниц мог бы существенно увеличить точность определения. Например, наличие каталога /wp-admin/ явно свидетельствует об использовании WordPress (да, это моя любимая CMS, потому ее название так часто встречается в тексте).
В настоящее время я подумываю начать работу над новой серией скриптов. В них я добавлю кэширование HTML-кода и автоматический сбор сигнатур. Последнее позволит существенно увеличить число определяемых движков. Кроме того, проверке будет подвергаться не доменное имя, а конкретный URL. Если быть точнее, код конкретной страницы, потому что скрипты будут читать его через STDIN, из кэша.
Дополнение: Нашел в сети сервис автоматического определения CMS, может кому-нибудь пригодится: http://2ip.ru/cms/. Кстати, на этом сайте вообще много интересных скриптов.
Дополнение: Продолжение эпопеи об определении CMS — Автоматическое определение движка форума.
Метки: Perl.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.