Сен 04 2008
Проверяйте сайты на битые ссылки!
Несколько месяцев назад мы работали над одним крупным проектом. Сайт создавался на CakePHP, на тот момент содержал 7 моделей и 14 контроллеров, общее количество записей в таблицах — несколько десятков тысяч. Каково же было наше удивление, когда придя в один прекрасный день утром на работу, мы увидели что больше половины данных из базы удалено. Да и оставшиеся данные исчезали прямо на глазах.
Дурацкая мысль - «хакеры!» - была опровергнута просмотром журнала веб-сервера. Оказалось что по сайту просто лазает бот поисковой системы. Лазает уже больше восьми часов — весь вечер, ночь и наступившее утро. Доступ к сайту мы тут же закрыли, базу — восстановили из резервной копии и начали анализировать почему это произошло.
Логи веб-сервера показали, что бот поисковика ходил по страничкам панели администрирования и «кликал» по всем подряд ссылкам. А там их много — добавление, редактирование, удаление записей, связи и т.д. Вот при клике по «удалению» - информация и пропадала. Интересно что: админка была закрыта дайджест-авторизацией и логином-паролем, все ссылки удаления требовали подтверждения на javascript’е.
Решили с имитировать действия бота с помощью программы для проверки битых ссылок — Xenu Link Sleuth. Программка во всех отношениях замечательная: маленькая, простая и очень быстрая. Достаточно ввести URL проверяемого сайта, в ответ выдаст список всех найденных ссылок на всех страничках сайта и статус этих страниц — найдена, если нет, то какая ошибка, показывает размер и тип содержимого. На всякий случай выкладываю архив с программой xenu.
После сканирования страничек выяснилось следующее. Контент-менеджер сайта удалил одну из устаревших статей из базы и забыл обновить ссылки на двух или трех других страничках, ведущие на удаленную статью. И все было бы в порядке, если бы при переходе по этим ссылкам выдавалась 404 ошибка. Но как раз в этом контроллере программист забыл удалить функции (и соответствующие им виды views), сгенерированные bake-скриптом из консольного комплекта CakePHP. И вместо 404 страницы, бот (или пользователь) попадал на функцию index этого контроллера. Автоматически сгенерированные функции обеспечивали полный функционал scaffolding’а: просмотр, создание, редактирование и удаление записей соответствующей контроллеру модели. Модель была связана с другими моделями, рекурсию никто не ограничивал — поэтому база с легкостью очищалась.
Выводов два.
1.Обязательно вычищайте все контроллеры, виды и модели от отладочного мусора перед выкладыванием в интернет. У нас в студии разработка ведется в соответствии с принципами «экстремального программирования», поэтому следить за этим приходится строго.
2.Регулярно проверяйте сайт на битые ссылки. Это полезно не только с точки зрения поиска ошибок, но и положительно сказывается на посетителях — для них все разделы сайта доступны — и поисковых машинах.
Ноябрь 5th, 2008 at 19:34
А главное проверяем в delete и edit экшенах, что запрос пришел через post.