Вторник, 25 декабря 2018 08:09

Как определить движок сайта. Определение CMS сайта (php скрипт)

Автор
Оцените материал
(2 голосов)
Как определить движок сайта. Определение CMS сайта (php скрипт) Как определить движок сайта. Определение CMS сайта (php скрипт)

Приветствую вас, друзья! Сегодня хочу рассказать Вам, как написать скрипт определения CMS сайта. Скрипт полностью написан на языке программирования PHP, без использования Java Script и JQuery.

Определение CMS сайта

Давайте начнем с теории. Перед тем как написать любой скрипт, я должен сам понять как он должен выполняться, действие за действием, чтобы потом объяснить это компьютеру. В первую очередь следует разобрать самый главный вопрос, как можно определить cms сайта самому? Ведь при визуальном осмотре сайта, не всегда сразу скажешь какой движок тут используется.

Первое что приходит в голову, найти что-то уникальное в каждом движке сайта, это и будет основной зацепкой для выводов. В этой статье я расскажу о способах определения cms, и потом мы выберем, какой вариант проще будет объяснить компьютеру.


Как определить движок сайта?

Основными моментами для определения движка сайта, являются:

HTML код на странице;
robots.txt;
Входа в админ-панель;
Онлайн сервисы и расширения для браузеров.

Хочу сразу отметить, что если вы вебмастер новичок, то вам поможет? только последний вариант, так как в остальных нужно быть опытным вебмастером, и понимать как устроенны CMS.

При просмотре html кода страницы следует уделить внимание коду, до тега body. Если быть конкретным то в первую очередь нужно посмотреть на мета теги а именно:

<meta name="generator" content="Drupal 7 (http://drupal.org)" />

Так же полезно будет посмотреть из какой папки подключаются css файлы, например:

/wp-content/themes/Organic/style.css

Опытные вебмастера знают, что папка wp-content есть, только у движка WordPress. Таким образом можно смело определить CMS. Но это простой пример, бывает, что одного просмотра кода мало, поэтому приходиться прибегать к другим вариантам.

Например просмотру файла robots.txt, о котором я подробно писал в этой статье. У каждой системы управления контентом есть такой файл, и в нем указанны стандартные настройки, которые можно изменить на свой вкус.

Disallow: /administrator/
Disallow: /cache/
Disallow: /components/
Disallow: /editor/
Disallow: /help/
Disallow: /images/
Disallow: /includes/
Disallow: /language/
Disallow: /mambots/
Disallow: /media/
Disallow: /modules/
Disallow: /templates/
Disallow: /installation
Disallow: /tmp/

Например, вот, один из стандартных "роботсов". Если вы не новичок, то сразу определили что это файл, CMS Joomla! Так как у каждого движка имеется много директорий, которые следует закрыть от индексации,они обязательно будут присутствовать в данном файле, что позволит узнать его систему.

Еще один из банальных, но не самых действующих способов определить движок сайта, это попытаться зайти в его адмнку. Например, для входа в админку в WordPress в конце адреса сайта следует добавить /wp-admin/, а у Joomla /administrator/.

Почему-же этот способ не сильно эффективен? Ну например доступ в админку можно как следует замаскировать, при помощи разных способов, парочку из них я описал тут. Так что он подойдет не для всех сайтов.

Ну и последний вариант - это использование различных сервисов распознавания CMS. В интернете их существует большое количество, но из всех, я бы посоветовал iTrack.

Или воспользуйтесь расширением RDS Bar, которое показывает большое количество информации о сайте.

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

Давайте сразу объясню почему будет сложно это сделать. Единственный варианат определить есть ли подключение(который мне пришел в голову), это определить по коду HTTP статуса. Вроде идея не плохая, но не универсальна. Дело в том что, при подключении к админке WordPress код равен 302, если на конце поставить слэш(/), а если его не ставить то код будет 301. При подключении к админке Joomla код равен 200, даже если пытаться в конце адреса сайта прописать, путь до админки WordPress, то он все равно останется 200. Этим самым я хочу сказать, что нет общего знаменателя, который бы позволял с точностью сказать, что это тот или иной движок.

Просмотр html кода сайта более лучший вариант, но тоже есть небольшое но. Искать в коде мета тег generator, вообще не вариант, так как не все верстальщики вставляют его в шаблон. Искать название папки откуда подключаются файлы стиля, тоже не совсем правильно. Дело в том, что у WordPress она уникальна(wp-content), а у Joomla и Bitrix они одинаковы(templates). Получается опять нет ощего знаменателя и этот вариант мы откладываем в сторону.

Остается только просмотр файла robots и на мой взгляд это самый лучший вариант. Дело в том, что практически у всех движков есть папки, названия которых не встречаются в других движках. В них содержаться файлы для корректной работы движка, и следовательно их необходимо закрыть от индексации. Более того, при установке движка на сервер, такой файл уже существует и в нем закрыты все ненужные папки. Значит у каждого движка, необходимо найти название папки, которое не будет повторяться и искать его в robots.txt вот и решение нашей задачи. Теперь пора приступить к написанию самого скрипта.


Распознавание CMS (PHP скрипт)

В первую очередь нам необходимо сделать саму форму для ввода сайта.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="/example/engine.php" method="POST">
<p><b>Введите адрес сайта:</b></p>
<input type="text" name="site"></p>
<p><input name="next" type="submit"></p>
</form>
</body>
</html>

 

Думаю тут особо объяснять ничего не надо, все на самом деле очень просто, но если у вас появились трудности с пониманием тегов, то посмотрите что они значат в онлайн справочниках. Я рассажу только об основных параметрах которые будут нужны для обработки скрипта.

В первую очередь параметру action в теге form необходимо указать адрес обработчика, то есть файла с кодом который будет обрабатывать отправленные данные. В моем случае, это тот же файл в котором будет код формы.

Далее не забудьте указать метод отправки данных в параметре method. Лично мне привычней отправлять данные методом POST. Если вы будите переделывать скрипт под свои нужды можете изменить метод на GET если вам так будет удобнее.

Ну и последними обязательными моментами кода, является атрибут name у тега input. Как вы наверно уже догадались, данный атрибут определяет название поля. Именно по нему мы будем определять какое поле и где надо использовать.

Теперь давайте перейдем в обработчику. Пожалуй я сразу выложу весь его код, а потом постепенно буду его объяснять. Данный код необходимо добавить перед выводом HTML кода.

<?php
if (!empty($_POST["next"])){

//фильтруем отправленный запрос
$zapros = preg_replace ( "/[^\-\/\.\ a-zA-Z0-9()]/", "", $_POST["site"] );

//удаляем введенный http
$http = "http://www.";
$str = str_replace($http, '', $zapros);
$http = "http://";
$str = str_replace($http, '', $zapros);

//удаляем все что идет после зоны домена
$parts = explode("/", $str);

//добавляем http и путь до файла robots к ссылке
$site = "http://".$parts[0]."/robots.txt";

// создаем массив с ключевыми словами CMS и их названиями
$cms['cms'][0]['text'] = "wp-includes"; //wordpress
$cms['cms'][0]['name'] = "WordPress"; //wordpress
$cms['cms'][1]['text'] = "tmp"; //joomla
$cms['cms'][1]['name'] = "Joomla!"; //joomla
$cms['cms'][2]['text'] = "misc"; //drupal
$cms['cms'][2]['name'] = "Drupal"; //drupal
$cms['cms'][3]['text'] = "core"; //ModX
$cms['cms'][3]['name'] = "ModX"; //ModX
$cms['cms'][4]['text'] = "engine"; //DLE
$cms['cms'][4]['name'] = "DLE"; //DLE
$cms['cms'][5]['text'] = "bitrix"; //Bitrix
$cms['cms'][5]['name'] = "Bitrix"; //Bitrix

// выполняем подключение к сайту и получаем его содержимое
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $site);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$data = curl_exec($ch);
curl_close($ch);

//запускаем цикл в котором будем перебирать массив и определять CMS
for($i = 0; $i <= 6; $i++){
$search = strchr( $data, $cms['cms'][$i]['text'] );
if($search != false){
$ansver = "Обнаруженна CMS:".$cms['cms'][$i]['name'];
break;
}else{
$ansver = "Скрипту не удалось определить CMS";
}
}
}

В самом начале кода устанавливается условие, которое будет запускать обработчик.
if (!empty($_POST["next"])){


if (!empty($_POST["next"])){

Если объяснять на простом языке, то условие звучит так: если значение POST запроса поля next, НЕ пустое, тогда будет выполняться весь последующий код.
//фильтруем отправленный запрос
$zapros = preg_replace ( "/[^\-\/\.\ a-zA-Z0-9()]/", "", $_POST["site"] );


//фильтруем отправленный запрос
$zapros = preg_replace ( "/[^\-\/\.\ a-zA-Z0-9()]/", "", $_POST["site"] );

Далее необходимо отфильтровать введенные данные, это необходимо для защиты вашего скрипта. Всегда фильтруйте все поля, в которые пользователи могут вводить данные и отправлять их в обработчик. При фильтре старайтесь не пропускать любые кавычки и точки с запятой, так как они часто используются в SQL запросах.

Фильтровать данные мы будем при помощи функции preg_replace. Суть этой функции заключается в поиске и замене по регулярному выражению. Регулярное выражение находиться в первых кавычках, оно сообщает функции, что можно пропускать большие и маленькие латинские буквы и цифры, а так же точки, тире и слэш. Все остальное заменять на то, что находиться во вторых кавычках(в данном случае просто удалять). Ну и последнее значение указывает функции где надо производить замену, в нашем случае в значении поля site.

//удаляем введенный http и www
$http = "http://www.";
$str = str_replace($http, '', $zapros);
$http = "http://";
$str = str_replace($http, '', $zapros);

Далее удаляем у запроса введенные "http://" или "http://www." Функция str_replace, аналогична preg_replace, только она ищет конкретный текст, а не работает с регулярными выражениями. Именно поэтому пришлось сделать поиск с www и без него. Зачем нужно все это удалять объясню чуть дальше.
//удаляем все что идет после зоны домена
$parts = explode("/", $str);

//удаляем все что идет после зоны домена
$parts = explode("/", $str);

Далее при помощи функции explode удаляем все, что будет находить после слэша. Если быть точным мы не удаляем, а делим строку на две. Обратите внимание, что в данном случае, мы работаем уже с переменной $str, так как теперь именно в ней находиться обработанное предыдущими функциями значение.
//добавляем http и путь до файла robots к ссылке
$site = "http://".$parts[0]."/robots.txt";

//добавляем http и путь до файла robots к ссылке
$site = "http://".$parts[0]."/robots.txt";

Теперь настал момент истины, давайте я наконец объясню зачем мы столько всего удаляли. Все на самом деле очень просто, мы не можем знать, какое значение будет вводить пользователь, с http и www или без, и будет ли он указывать, только домен или ссылку на конкретную страницу. Поэтому чтобы быть уверенным в том, что скрипт получит необходимое значение, а именно domain.zona, мы удаляли все лишнее.

Теперь когда мы имеем необходимое значение, мы сами добавим к нему остальные данные, а именно http:// и путь до файла robots.txt. Заметьте переменной $parts обязательно необходимо добавить [0] так как, после разделения строки, в переменной храниться массив. Если вместо нуля поставить один, то получим слэш и все что было введено после него.
// создаем массив с ключевыми словами CMS и их названиями
$cms['cms'][0]['text'] = "wp-includes"; //wordpress
$cms['cms'][0]['name'] = "WordPress"; //wordpress
$cms['cms'][1]['text'] = "tmp"; //joomla
$cms['cms'][1]['name'] = "Joomla!"; //joomla
$cms['cms'][2]['text'] = "misc"; //drupal
$cms['cms'][2]['name'] = "Drupal"; //drupal
$cms['cms'][3]['text'] = "core"; //ModX
$cms['cms'][3]['name'] = "ModX"; //ModX
$cms['cms'][4]['text'] = "engine"; //DLE
$cms['cms'][4]['name'] = "DLE"; //DLE
$cms['cms'][5]['text'] = "bitrix"; //Bitrix
$cms['cms'][5]['name'] = "Bitrix"; //Bitrix

// создаем массив с ключевыми словами CMS и их названиями
$cms['cms'][0]['text'] = "wp-includes"; //wordpress
$cms['cms'][0]['name'] = "WordPress"; //wordpress
$cms['cms'][1]['text'] = "tmp"; //joomla
$cms['cms'][1]['name'] = "Joomla!"; //joomla
$cms['cms'][2]['text'] = "misc"; //drupal
$cms['cms'][2]['name'] = "Drupal"; //drupal
$cms['cms'][3]['text'] = "core"; //ModX
$cms['cms'][3]['name'] = "ModX"; //ModX
$cms['cms'][4]['text'] = "engine"; //DLE
$cms['cms'][4]['name'] = "DLE"; //DLE
$cms['cms'][5]['text'] = "bitrix"; //Bitrix
$cms['cms'][5]['name'] = "Bitrix"; //Bitrix

Теперь создаем многомерный массив, в котором будут храниться данные по которым мы будем определять CMS. Я не буду углубляться в объяснение многомерного массива, на это в интернете есть очень много статей. Если говорить коротко - это массив в котором есть ещё несколько массивов. В нашем случае они разделяются цифрами от 0 до 5 и у каждого есть по два поля text и name.

Я выбрал названия уникальных папок у каждого из шести движков, которые обязательно должны находиться в файле robots.txt и записал их названия в поля text, а полю name соответственно присвоил название движка.

Вы можете легко добавить другие CMS, аналогично существующим, главное не забудьте цифры менять.
// выполняем подключение к сайту и получаем его содержимое
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $site);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$data = curl_exec($ch);
curl_close($ch);


// выполняем подключение к сайту и получаем его содержимое
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $site);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$data = curl_exec($ch);
curl_close($ch);

Следующим действием будем подключаться к указанному url при помощи функции cURL и получать его содержимое для дальнейшего анализа. В этой статье, я не буду углубляться в объяснение данной функции. В ближайшем будущем планирую написать о ней подробную статью. Единственное, что вам надо понять, это то, что в переменной $data будет находиться содержимое полученного файла robots.txt.
//запускаем цикл в котором будем перебирать массив и определять CMS
for($i = 0; $i <= 6; $i++){
$search = strchr( $data, $cms['cms'][$i]['text'] );
if($search != false){
$ansver = "Обнаруженна CMS:".$cms['cms'][$i]['name'];
break;
}else{
$ansver = "Скрипту не удалось определить CMS";
}
}


//запускаем цикл в котором будем перебирать массив и определять CMS
for($i = 0; $i <= 6; $i++){
$search = strchr( $data, $cms['cms'][$i]['text'] );
if($search != false){
$ansver = "Обнаруженна CMS:".$cms['cms'][$i]['name'];
break;
}else{
$ansver = "Скрипту не удалось определить CMS";
}
}

Теперь осталось дело за малым, запустить цикл и перебрать созданный массив с CMS. Цикл for работает довольно таки просто, переменная $i равна нулю, так как первая цифра в многомерном массиве именно ноль. Далее указываем какое количество раз, цикл будет повторяться, в нашем случае необходимо шесть повторений, так как в нашем массиве всего шесть CMS. Если будите добавлять свои CMS, то не забудьте изменить цифру, на необходимую вам. Ну и в конце, добавляем инкремент(++) для переменно $i, то есть увеличиваем значение на один.

Когда запускается первое повторение цикла, мы при помощи функции strchr запускаем поиск в переменной $data первого вхождения указанного в массиве $cms['cms'][$i]['text'] и сохраняем его в переменной $search. Обратите внимание, что в массиве, вместо цифры у нас стоит переменная $i. Таким образом на каждом повторении цикла мы будем искать разные значения в переменной $data.

Далее идет условие: если переменная $search не равна false, то есть значение массива найдено, тогда переменной $ansver присваиваем значение: Обнаружена CMS: $cms['cms'][$i]['name']. Далее при помощи функции break прерываем цикл. Иначе, если переменная $search равна false, то есть значение массива не найдено, выводим сообщение об ошибке.

Теперь остается вывести переменную $ansver, для этого добавьте код предложенный ниже, после закрывающего тега form.
if (!empty($site)){
echo $ansver;
}

if (!empty($site)){
echo $ansver;
}

Вы можете проверить работоспособность скрипта, перейдя по ссылке ниже.

http://www.workwebsite.ru/example/engine.php

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

Прочитано 430 раз Последнее изменение Вторник, 25 декабря 2018 08:19

Оставить комментарий

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены