Определение CMS сайта (php скрипт)

Автор: Илья Остапенко /

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

сервис определения cms

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

определение cms при помощи rds bar

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

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

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

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

 

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

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

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

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

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

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

 

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

В самом начале кода устанавливается условие, которое будет запускать обработчик.

Если объяснять на простом языке, то условие звучит так: если значение POST запроса поля next, НЕ пустое, тогда будет выполняться весь последующий код.

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

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

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

Далее при помощи функции explode удаляем все, что будет находить после слэша. Если быть точным мы не удаляем, а делим строку на две.  Обратите внимание, что в данном случае, мы работаем уже с переменной $str, так как теперь именно в ней находиться обработанное предыдущими функциями значение.

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

Теперь когда мы имеем необходимое значение, мы сами добавим к нему остальные данные, а именно http:// и путь до файла robots.txt. Заметьте переменной $parts обязательно необходимо добавить [0] так как, после разделения строки, в переменной храниться массив. Если вместо нуля поставить один, то получим слэш и все что было введено после него.

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

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

Вы можете легко добавить другие CMS, аналогично существующим, главное не забудьте цифры менять.

Следующим действием будем подключаться к указанному url при помощи функции cURL и получать его содержимое для дальнейшего анализа. В этой статье, я не буду углубляться в объяснение данной функции. В ближайшем будущем планирую написать о ней подробную статью. Единственное, что вам надо понять, это то, что в переменной $data будет находиться содержимое полученного файла robots.txt.

Теперь осталось дело за малым, запустить цикл и перебрать созданный массив с 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.

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

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

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

 

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

Это не спам.