Поиск по сайту:  



Фотогалерея

Блог: Простейшая реализация теста Тьюринга на сайте

Поделиться в социальных сетях:

Просмотров: 655

Комментариев: 0

Если созданный тобой онлайн-сервис стал популярным — это, бесспорно, не может не радовать. Если на него начинают ссылаться с других сайтов — это замечательно. Но если он приобретает чрезмерную популярность, особенно среди любителей автоматической отправки запросов (как это произошло с размещённым мной на сайте «Медиа-Пандора» онлайн-сервисом перемешивания слов) — то обработка запросов начинает создавать заметную нагрузку на сервер.

На фразу «только для ручного использования» любители автопостинга, как известно, кладут с прибором не обращают внимания. А стало быть, единственное очевидное решение — тест Тьюринга.

Следует оговориться, что по ряду причин я несколько недолюбливаю этот вид верификации пользователей. Но поскольку другого решения под рукой не оказалось, а нагрузка на сервер продолжала возрастать с каждым днём — пришлось прибегнуть именно к этому способу слегка поумерить аппетиты автоматизаторов.

И здесь передо мной возник ряд вопросов, основной из которых — на какой основе построить тест Тьюринга? Нет, понятное дело, что визуально тест должен представлять собой небольшую картинку с несколькими цифрами, которые пользователь должен ввести рядом в текстовом поле, но — как увязать между собой наименование картинки с числом, значение числа на картинке и его же копию на сервере?

Задача сгенерировать саму картинку средствами PHP особых трудностей не встретила. А вот над алгоритмом пришлось крепко поразмыслить. До сих пор мне не доводилось создавать алгоритм такого теста, а готовый механизм, естественно, брать у меня и в мыслях не было, в силу чего пришлось приступить к «изобретению велосипеда». Самый очевидный и самый дурацкий вариант — присвоить картинке числовое наименование, соответствующее отображённому на картинке числу — было отброшено сразу же: настроить автоотправщика данных на парсинг наименования картинки — делов на считанные секунды, поэтому наименование картинки должно быть таким, чтобы при его анализе нельзя было автоматически вычислить изображённое на картинке число. Затем последовала идея с сохранением контрольного числа в сессии — она также была отброшена как неудачная в связи с тем, что сессии на упомянутом сайте используются для авторизации, засорять же сервер краткосрочными сессиями, а существующие сессии — лишними переменными, мне представлялось не самым удачным решением. Следующим в небытие последовал вариант с сохранением значений придуманых для теста чисел в базе данных MySQL — чересчур много мороки с подключением к базе данных и отправкой запросов: именно то, что принято называть «из пушки по воробьям».

Ну и наконец, самым последним в голову пришло простое, и по-моему, эффектное решение. Как ни странно, по своей сути оно оказалось всего лишь слегка видоизменённым вариантом первого варианта, который выше был назван мной самым дурацким.

При генерации числа для теста создаётся и сохраняется на сервере картинка с изображением этого числа, и её наименование в известном смысле действительно представляет собой изображённое на картинке число — только не в открытом виде, а зашифрованное при помощи алгоритма md5. Однако в связи с тем, что в сети размещено множество таблиц соответствия простых последовательностей и их md5-хешей (то есть настроить автоматический подбор подходящего хеша не самая трудная задача), — после зашифровки задуманного числа к результату шифрования добавляется (методом конкатенации) несколько символов — так называемая «соль», — после чего полученная последовательность шифруется повторно, также методом md5. Затем от полученного в результате последней операции хеша отрезаются первые 16 символов (просто для пущей краткости) — именно они и представляют собой наименование картинки на сервере. Ну а дальше дело техники: получив от пользователя введённый в текстовом поле набор цифр, модуль верификации шифрует этот набор тем же самым способом, каким шифруются числа для теста, точно так же отрезает от него первые 16 символов и ищет на сервере картинку, наименование которой идентично этим 16 символам. И если картинка с таким наименованием на сервере не найдена — значит, ответ на контрольный вопрос указан неверно (либо вообще не указан). Возможно, это не самый удачный способ, не спорю, но лично мне он нравится тем, что не использует ни обращение к базе данных, ни сессии.

Комментарии

Добавить новый комментарий:

Как вас зовут:

Прим. автора сайта: премодерация всех комментариев.

комментариев не найдено — ваш может стать первым!


© «Таксор». Интернет-мастерская М. Ю. Уткина.