У силовой госконторы имеется маленький сайт с новостями и обратной связью, куда можно слёзно и анонимно «настучать». В обычный будний день от высшего руководства приходит бумага с жалобой, в которой человек рассказывает, что обратная связь не работает, руководителям по барабану, и вообще он очень обижен и оскорблён. Бумага требует обратного отзыва, начальство поднимается на уши. Я, пребывая в шоке, демонстрирую руководству, что всё исправно работает: жалобы поступают на специальный электронный ящик.
Начинаем искать «анонима», через час находим. В ходе беседы в стиле «ни единого разрыва» с чередой угроз и воплей начинаю понимать суть. Как оказалось, после ввода огромного сообщения, написанного в порыве ярости, дядя с желчью на губах сразу тыкал кнопку «Отправить». После этого страничка требовала ввести код подтверждения. «Аноним», пребывая в состоянии когнитивного диссонанса, не успокаивался и продолжал фанатично тыкать «Отправить». После пятого щелчка страница становилась девственно чистой, происходил нервный срыв, и цикл повторялся. Только после трёх циклов борец за справедливость решил поступить по старинке.
Замутили наши инженеры с дизайнерами новый интерфейс для пользовательcких страниц на сайте. Красивый, навороченный, детально настраиваемый через длинный список чекбоксов. В тот же день звонит клиент:
— У меня со страницы пропала вся моя реклама!
Лезу в настройки нового интерфейса, проматываю до страницы с настройками рекламы — все галочки стоят. Иду к одному продвинутому коллеге, к другому — все подтверждают, что галочки на месте.
Делать нечего — пишу инженерам. Ответ примерно следующий:
— Вы что, рекламщики, вообще читать разучились?! Там же напротив галочки написано: «Запретить показ рекламы». Значит, она должна быть выключена, а не включена!
Сижу теперь в смешанных чувствах. С одной стороны, стыдно перед инженерами за себя и коллег, что невнимательно читали. А с другой — ну вот какого художника было менять значение на отрицательное и прятать среди двух десятков положительных?
Сайты в правительственном домене .gov.страна. Ресурсы с информацией по тендерам пестрят многотысячными заказами на разработку информационных порталов и систем управления с веб-доступом к специальным базам данных. За такие заказы берутся энтерпрайзные конторы с внушительным послужным списком и списком услуг, в котором не только разработки шаблонов для «джумл» и «вордпрессов», но и услуги по осуществлению аудита, построения систем защиты данных с ограниченным доступом, и прочее, прочее, прочее.
Когда же, загружая официальный документ с разработанного энтерпрайзной конторой новенького, с иголочки, сайта, абсолютно ненамеренно вытерев в адресной строке всё, кроме домен.gov.страна/files/, видишь листинг каталога веб-сервера, уже становится нехорошо.
Когда, следом заглянув в robots.txt, видишь в списке запрещённого ботам каталог популярного визивиг-редактора, к горлу подкатывает ком: «Это же крупная государственная контора, этого не может быть!»
Когда далее находишь в каталоге этого редактора веб-интерфейс плагина для загрузки файлов, не прикрытый даже банальной http-авторизацией, невольно вырывается истерический хохот: «Я могу загружать файлы? Это сон? Так не должно быть!» Но версия загрузчика настолько стара, хоть и свободна-открыта, что может благодаря уязвимостям трёхлетней давности заливать что угодно — хоть .exe, хоть .php.
Торопишься написать письмо веб-мастеру, описываешь всё в мельчайших деталях, отправляешь, ждёшь ответа — час, два, полдня, день… Ответа нет, изменений на сайте тоже. Будний день.
Минуты сомнений. Статья 361 УК? Но я же не преодолевал никаких средств защиты, их просто не было на моём пути! Потемнение разума на одно мгновение — и ты уже видишь Ubuntu на третьем ядре, не обновлённом после обнаруженной в январе уязвимости Mempodipper, установленный на сервер (sic!) KDE, энтерпрайзная БД Oracle, несколько дампов — наверное, бэкапы. Ну, хоть не совсем отсталые админы. Хотя…
В домашних каталогах админов — гигабайты видео (wget со ссылками в истории команд), музыка на любой вкус, каталог games на пятнадцать гигабайт. «Герои Голд»? Не, не играл в такое. Ничего не трогаю, ничего не удаляю, ничего не сливаю, выхожу, оставив записку на видном месте.
Письмо-ответ от вебмастера так и не пришло. Радует, что сайт таки прикрыли через несколько дней — видимо, при помощи rm -rf /*. Теперь моя совесть чиста.
Ребята, если вы узнали себя, не стесняйтесь — давайте спишемся, встретимся за бокалом хмельного напитка вечерком. Поскольку «спасибо» я не дождался, то вы угощаете. За беседой я расскажу вам, у кого из ваших коллег по правительственным сайтам до сих пор есть или была такая же фигня, а вы мне — как с таким уровнем знаний, умений и профнавыками получать такие заказы и такую работу. Буду ждать.
Я веб-дизайнер. Неделю назад общались с клиентом по скайпу, оговаривали детали, каким он хочет видеть сайт и так далее. В итоге пришли к выводу, что в логотипе нужно обыграть фамилию. Какую-то там фамилию на «К», неважно — в истории ведь сохранилось. Договорились, что свяжемся, когда я отрисую макет.
Клиент не торопил, поэтому всю неделю я заканчивал предыдущий проект. И вот настало время взяться за новый заказ. Так, что же там за фамилия была?.. Лезу в скайп, открываю историю сообщений. Негусто. Тут явно чего-то не хватает: переписка была больше. Иду в настройки, смотрю — «Хранить всё». Но тут явно не всё! Не может ведь CCleaner чистить историю, а если б и чистил — то всю сразу, а не частично.
Помню, что общался только по телефону и скайпу, но себе уже не очень доверяю. Проверяю почту — нет, не было ничего. Значит, скайп! Ползу в AppData\Roaming\Skype. Ага, chatsync — наверное, то. Открываю — иероглифы. Пробую кодировки — лажа. Зашифровали, демоны!
Ничего, Гугл в помощь. На каком-то форуме нахожу прогу, которая расшифровывает историю скайпа, ссылочка прилагается, причём рабочая — красота! Качаю, запускаю. Погасить скайп? Да пожалуйста! Вуаля, вся переписка как на ладони. И где же то сообщение? Где эта проклятая фамилия?! Она ведь была! Была напечатана! Я её читал!
Не, клиенту звонить — не вариант. Совсем не вариант. Звонить… Телефон… «Сообщения → Входящие»… Вот же она, родимая!
Честь мундира спасена. Можно приниматься за работу.
Зашёл как-то в гости друг с парой бутылочек пива, а я на то время сайт писал уже достаточно продолжительное время. Ну, думаю, отвлекусь немного, передохну. Слышу от товарища, который внезапно оказался за моей спиной и смотрит в монитор, фразу:
— Нда, какой ты стал жестокий с этой работой… Ты бы отдохнул, что ли, а то только убивать тебе и убивать кого-то!
Начинаю судорожно искать причину вывода. Взгляд падает на слишком частые вызовы die(); в коде. Баголовство было в самом разгаре…
На неделе занимался оптимизацией одного очень убогого ресурса: треть сайта в CP1251, половина в UTF-8, остаток в KOI8-R, и всё это сопровождается постоянными iconv(). Стоит ли говорить о промышленных поставках отборных матюгов при исправлении всего этого?
Но речь не о том. Вспомнился случай, произошедший в мои эникейские годы. Утро понедельника, звонок на внутренний номер:
— Доброе утро! У нас тут буквы волосатые, а вчера нормальные были!
Оказалось, что понедельник у конкурентов тоже был несладким: в заголовке их страницы не была указана кодировка.
Работала над проектом сайта. Днём — учеба, ночью — работа. И вот возвращаюсь я домой, иду по виадуку в сторону вокзала и вижу, что надпись на вокзале превратилась в абракадабру. С мыслями «Ёшкин кот, кодировка слетела!» судорожно тянусь к мышке…
На буквах, полностью имитируя слетевшую кодировку для уставших от мониторно-клавиатурных упражнений глаз, сидели голуби.
Работал я над cайтом. В одно предрабочее утро пишет мне другой программист, работающий над этим же проектом, только удалённо. Говорит, что сайт не работает. Пытаюсь зайти сам — ошибка подключения к MySQL. Ну, думаю сервер упал или перезагружают.
Приехал на работу, позвонил сисадмину: «Перезагрузи MySQL-сервер». — «Смысла нет, наc DDoS’ят». Начинаем разбираться. Cтранное дело: атаки идут с внешнего IP компании. Получается, валим мы сами себя. Ну, подумали, ботнет пробрался в сеть. А по логам ничего не видно, кроме IP. Запрашивается корень, строка UserAgent пустая.
Искали мы вирус два дня. Уже думали отключать по одной подсети, чтобы таким методом сузить круг подозреваемых. Решили распарсить логи — может, там что-нибудь видно будет. Заметили, что количество запросов в секунду всегда равно 63. И у меня в памяти копошится то же число: что-тогде-то на сайте было равно 63.
Решил проверить последний модуль, который правил — скроллер товаров. Зашёл в его настройки — и точно, установлено 63 товара на отображение. Полез в исходники. Там проверяются размеры картинок товаров, чтобы они одинаково выглядили в скроллере, а картинки-то загружаются по HTTP! Вместо того чтобы заглянуть в соседнюю папку и узнать размеры там, скрипт тянул картинки через сервер, тем самым напрочь забивая канал.
Выложил в сеть сайт на Джумле. Морда грузится нормально, внутряк выдает 404 ошибку и что-то пишет про IIS. Тариф у хостинга такой, что есть возможность выбрать как *nix-, так и Win-варианты сервера. Но дело было уже поздно ночью, и мне лень было разбираться в панели хостера, как там и что. Решил черкнуть в саппорт, а утром чекнуть мыло, где бы меня носом ткнули, и всё встало бы на свои места. Пишу. Указываю внутренний URL страницы — что-то типа www.site.ru/content/view/3/5/. Cпрашиваю: в чём может быть проблема?