вторник, 17 февраля 2015 г.

Естественный отбор — враг бота

Привожу полную запись из источника (пусть и полгода с неё уже прошло, а меня только сейчас порадовало):

Интересный баг только что отловили. Рассказываю.

Имеем сервис с капчами. Чтобы уменьшить время отклика логично генерировать картинки по случайному коду в свободное время в час наименьшей нагрузки. Так и делаем — ставим в крон задачку, делаем 100500 капч (картинка + код в базе) и в течение дня их показываем. На тот случай если прегенерированные капчи все-же закончатся, делаем режим аварийного полета — если отгаданная и, в связи с этим, убираемая из базы капча уменьшает общее число капч до опасного уровня (например, остается меньше 50), то генерируем новую капчу вместо убранной.

Казалось бы, простая и рабочая схема. Так и было до недавнего времени.

Посыпались жалобы что капчу невозможно разгадать. Жалобы начинали поступать исключительно после 19:00 когда все разработчики уже закрывают IDE и запускают доту. Причем, при условии правильной реализации случайной генерации капч (проверили первым делом) в конце дня все (ну или почти все) капчи стали заканчиваться на D.

Оказалось, что происходит следующее: капчи кончаются. Но, поскольку мы не убираем из базы показанные, но не разгаданные капчи, то среди прегенерированных капч начинает работать естественный отбор и к концу дня мы имеем 50 самых злых и сложных капч в мире. Дальнейшее развитие ситуации, когда взамен разгаданной капчи мы добавляем случайную — не сильно улучшает дело. Попутно мы выяснили что самая потенциально неразгадываемая буква в капчах — D, потому что при достаточной степени искажения треть юзеров интерпретирует ее как D, треть как 0 (ноль) и треть как О. А еще 46% вводят русской буквой.

Вот он, естественный отбор в действии!
Хотите поделиться ссылкой? Добавьте в закладки: