Итак, в первой части были рассмотрены основные приёмы, которые используются недобросовестными веб-мастерами (они же гоблины) для раскрутки своих сайтов за счёт нас.
Сегодня будем учится выявлять файлы и участки кода в шаблонах WordPress, которые были изменены и содержат вредоносный с точки зрения SEO код для нашего сайта.
Для того, чтобы статья оказалась одинакого полезной и тем, кто решит писать свои программы для проверки скриптов и для тех, кто просто хочет обезопасить себя и свой сайт, я решил разделить пост на две части:
- Рассмотрим пример приложения для проверки архивов тем WordPress
- На основе первой части поста рассмотрим некоторые технические моменты проверки.
1. Приложение для проверки архивов с шаблонами WordPress
Как я уже говорил, проверка шаблона WordPress на «вшивость» зачастую происходит в момент, когда шаблон уже установлен либо находится в распакованном состоянии у Вас на хостинге. Но каждый раз распаковывать тему, грузить в блог, проверять и удалять «вшивые», согласитесь — может занять очень много времени, несмотря на то, что плагин TAC работает достаточно быстро.
Разработанное приложение под кодовым названием «Achtung!!!» способно проверить необходимый Вам шаблон в тот момент, когда шаблон находится ещё в zip-архиве у Вас на жестком диске, избавляя Вас тем самым от лишних закачек на хостинг, распаковок и т.д.
Рассмотрим работу программы на примере.
Запускаем приложение, выбираем файл архива темы WordPress и жмем кнопку «Проверить»:
После этого программа проверяет файлы архива по трем показателям:
- Кодировка файла — если кодировка файла UTF-8 BOM, то это означает, что кто-то мог изменять файл, следовательно — отмечаем этот файл как потенциально опасный
- Наличие прямых статических ссылок в файле — проверяются ссылки вида http://sait… Если такие ссылки найдены — помечаем файл как потенциально опасный
- Наличие закодированных участков — если обнаружен закодированный участок, то кто-то явно хочет либо защитить свои авторские права, либо «наколоть» доверчивого блоггера, зашифровав свою ссылку.
Теперь выбираем в списке любую ошибку и смотрим как она выглядит в файле:
Если ссылка легальная, например, ссылка на разработчика темы, то всё в порядке. Сразу скажу, что в программе есть список исключений (пока недоступный для редактирования) в котором содержаться адреса сайтов, которые никак не могут быть обозначены как ГС или нелегаьными. Вот ти ссылки:
- http://www.gravatar.com
- http://www.w3.org
- http://gmpg.org
- http://www.g-loaded.eu
Последняя ссылка относится к разраотчкику плагина RecentComments в теме моего блога.
Кроме того, что Вы можете посмотреть сатические ссылки в файлах, Вы также можете посмотреть список измененных файлов шаблона WordPress. Для этого необходимо кликнуть по строке «Измененных файлов: «. В результаты Вы получите сообщение следующего содержания:
Все файлы, которые содержаться в списке измененных необходимо как минимум правильно пересохранить. Т.е. установить кодировку UTF-8 без BOM, иначе вы рискуете получить сообщения об ошибках.
Представленная программа не является законченным продуктом, она дописывается, добавляются новые возможности, функции и т.д. Сейчас Вы можете её использовать для проверки своих архивов с темами WordPress, а также принять активное участие в её развитии — рассказать какие функции вы бы хотели увидеть в программе, какие ошибки (не дай бог) были замечены в программе и т.д. По возможности, все Ваши комментарии будут учтены при выпуске следующих версий программы.
Ссылка на скачивание программы находится в конце поста.
Теперь перейдем к техническим моментам реализации пдобных программ.
2. «Achtung!!!». Технические детали.
Признаться первый раз за всё время работы в Lazarus столкнулся с моментом, когда Lazarus оказался более удобным в использовании, чем Delphi. Обычно чаша весов склонялась в сторону уже знакомой RAD — то в Лазаре нет нормальной работы с регулярками, то нет привычных комонентов, и т.д. и т.п. А здесь как-то оказалось всё наоборот.
По сути, алгоритм проверки архива достаточно прост:
- Распаковываем архив во временный каталог или загоняем все файлы в поток
- Провряем файлы на наличие в них нежелательного кода
- Удаляем файлы, если они более нам не нужны
- Выводим результат.
При работе со списком найденных ошибок:
- Грузим содержимое файла в любой компонент (Memo, ListBox и т.д.)
- Подсвечиваем найденную ошибку
Для осуществления этих простеньких алгоритмов нам как минимум надо осуществить распаковку zip-архива и представить содержимое файла в удобном для чтения виде, например, подсветить элементы кода.
Оказалось, что в Lazarus и распаковка архивов и подсветка синтаксиса производятся намного проще и быстрее, чем в Delphi.
Работа с архивами в Lazarus организуется слдующим образом. Скачивается последняя версия модуля zipper с адреса http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/packages/paszlib/src/ . В uses Вашего прилоения подключаются модули:
- скачанный zipper
- paszlib, входящий в состав Лазаря
Далее, распаковку архива можно осуществить, например так:
[...] with TUnZipper.Create do begin FileName:=AFile; OutputPath:=FSaveDir; UnZipAllFiles; end; [...]
где AFile — файл zip-архива; FSaveDir — путь к дирректории в которую будет распакован архив
Далее, если Вам необходимо получить имена файлов и папок из архива, то достоточно обратиться к свойству Entries объекта TUnZipper, например, перечислить все папки и файлы:
for i:=0 to Entries.Count-1 do begin ShowMessage(Entries[i].ArchiveFileName) end;
Примерно также просто проводится и упаковка файлов в архив.
Далее, что касается подсветки синтаксиса. Помниться, я уже рассматривал в блоге вопрос по подсветки синтаксиса. Можно было бы воспользоваться этим алгоритмом. Но зачем? В Lazarus присутствует целая вкладка компонентов для подсветки синтаксиса:
Судя по свойствам этих компоентов, с их использованием можно организовать редактор кода, наподобие того, что используется в Delphi, т.е. организовать фолдинг, автозавершение кода, переход к участкам кода по клику и т.д. и т.п.
Рассмотрим, например, подсветку синтаксиса PHP.
Берем с вкладки SynEdit компоненты ТSynMemo и TSynPHPSyn. В свойстве ТSynMemo.HightLigter выбираем SynPHPSyn1…и всё. Подсветка синтаксиса по-умолчанию обеспечена. Теперь можете загружать в SynMemo текст из файлов, писать вручную и т.д. Ключевые слова выбранного языка быдут автоматически подсвечиваться.
Теперь, что касается кодировок файлов. Не знаю, есть ли в Delphi стандартные функци определения кодировок (вполне возможно с поддержкой юникода и появились), но в Lazarus кодировка любого текстового файла определяется элементарно.
Подключаем в uses модуль LConvEncoding. Грузим содержимое файла, например в TStringList вызываем функцию:
FileEncoding:=GuessEncoding(List.Text);
После этого в FileEncoding будет содержаться строка, определяющая кодировку файла. В модуле определены также следующие константы, облегчающие анализ кодировки:
const EncodingUTF8 = 'utf8'; EncodingAnsi = 'ansi'; EncodingUTF8BOM = 'utf8bom'; // UTF-8 with byte order mark EncodingUCS2LE = 'ucs2le'; // UCS 2 byte little endian EncodingUCS2BE = 'ucs2be'; // UCS 2 byte big endian
Для нас при проверке шаблонов WordPress на «вшивость» достаточно определить кодировки EncodingUTF8 = ‘utf8’ и EncodingUTF8BOM = ‘utf8bom’.
Кстати, используя этот же модуль можно «на лету» менять кодировки — функций для этой операции более чем достаточно.
Вот пожалуй и все на сегодня. Жду Ваших предложений по развитию «Achtung!!!». Если есть желание посодействовать в разработке в плане кодинга, то, думаю, что в скором времени смогу предоставить исходники программы.
Скачать программу можно, перейдя по этой ссылке

вот так и рождаются идеи для хороших программ :)
как вариант еще проверять на наличие чего-нибудь типа eval($_GET[‘cmd’]) или просто eval. Со временем можно развить в анализатор php-кода :)
Ну проверка по куску текста типа http:// , base64 и т.д. — это без проблем. Сейчас пробую сделать как раз небольшой анализатор в связке php-css на предмет описаний атрибутов с display:none и т.д. и отслеживание вызовов «левых» функции
на странице http://www.webdelphi.ru/soft-webdelphi-ru/ скачал WPCHECKER. Но, к сожалению, работает она не корректно. Не проверяет архивы тем, а выдает ошибку. (