Реализация Captcha без БД

16 комментариев

На данный момент все известные капчи делятся на категории

  • Хранение некоего ключа в базе данных
  • Хранение некоего ключа в сессии
  • Без хранения каких либо данных

Минусы первых двух видов — это необходимость работы с файлами (для БД — операции запись/чтение, а  для сессий это еще и создание файлов). Плюсы же — это высокая защищенность и простая реализация.

На данный момент все известные реализации капчи из третьей категории являются не защищенными. Но плюс у них — это отсутствие работы с файлами. Допустим при массовой атаке спам ботов не засирается таблица в БД и не засирается папка с сессиями.Я разработал и предлагаю вам реализацию капчи из третьей категории, но без ее минуса. Вообщем меньше слов, больше дела.

Вот схематичный алгоритм генерации капчи:

Как видно здесь генерируется два ключа form_ssid_hash и form_ssid_time. Эти два ключа передаются вместе с параметрами из формы защищаемой капчей в скрипт который принимает данные из формы и который будет проверять правильность ввода капчи. А также form_captcha поле для ввода строки из капчи.

Теперь перейдем к реализации проверки правильности ввода капчи:

Здесь думаю все понятно. Кстати вы наверное заметили в обоих схемах используются две константы sec_pass и sec_key. Обе эти переменные никоим образом не должны стать известны третьим лицам.

Вот собственно и весь алгоритм.

  1. Trololo

    В вашей капче есть минусы. Это возможность использования полученных сидов в течении ограниченного вами времени, т.е. 15 минут. При этом если пользователь просидел с открытой страницой для ввода капчи больше 15 минут, то ему прийдется обновлять ее заново.
    По сути 15 минут для спам бота будет достаточно чтобы заспамить весь сайт, так что говорить о том что ваша капча лишена минусов — неправильно.

    1. Дмитрий Амиров Автор

      Да, вы правы. Но если подойти к этой задаче более творчески, то немножко модифицировав алгоритм можно добится того чтобы избавится от указанных выше минусов.
      К примеру я после того как проверка была пройденна успешно создаю в папке tmp файл с именем хеша form_ssid_hash
      А при проверки правильности ввода проверяю наличие фала с таким именем.

      1. Trololo

        Да, но тогда какое ее отличие будет от написанных вами «первых двух категориях»?

        1. Дмитрий Амиров Автор

          На самом деле огромно.

          Не надо подключатся к БД. Не надо инициализировать сессии. file_exists работает очень быстро.

          1. Trololo

            Хм, хорошо, допустим. Но тогда в таком случае и проверки на время впринципе не нужны.

          2. Артем

            Проверки на время нужны для того чтобы можно было уникализировать генерируемые хеши!

          3. Trololo

            Да, действительно, об этом я и не подумал =(
            Привык сталкиваться только с захешированным rand

          4. Артем

            Что впринципе в данном контексте одно и тоже, но шифровать время — это дополнительная возможность проверить время жизни хеша

  2. Fenix

    Идея не плоха, но как сказал trololo при большом времени жизни сидов, смысла нету, так как можно воспользоваться сервисом по расшифровке капчей и за 15 минут заспамить весь форум, расшифровав только одну капчу.
    Но! Идея алгоритма замечательна, если подойти более грамотно. Все наверное регистрировались хоть раз на mail.ru? Так вот, вы замечали, что форма для ввода капчи появляется только после нажатия кнопки «отправить»? Аяксом подгружается картинка и появляется поле для ввода.
    Так вот. Если в своем проекте реализовывать что то похожее то самым правильным решением будет использовать этот алгоритм. Так как уменьшив время жизни до допустим 30 секунд (за 30 секнуд любой юзер сможет ввести капчу), мы лишаем возможности спамбота отправить капчу на расшифровку (время расшифровки капчи на всех сервисах минимум 30 секунд), не грузим юзера лишней информацией во время заполнения основной формы. Тока к этому всему необходимо дописать автообновление капчи каждые 30 секунд, а также возможность работы без javascript.
    Вообщем мой вердикт — алгоритм имеет право жить.

    1. Дмитрий Амиров Автор

      Спасибо, за ваш комментарий, и ваше предложение. Действительно, разумный подход.

    2. Trololo

      Впринципе, вы правы. Только появляется тогда другой минус — это очень геморно реализовывать)

      1. Fenix

        Ну для обычных проектов, где пользователей мало, смысла в каком то геморе с капчей нет. Хватит и обычных сессий, так как нагрузки не будет.
        А вот в высоконагруженных проектах приходится оптимизировать все и вся.

    3. Артем

      Да, вот только за 30 секнуд ваш сайт могут заспамить так, что мало не покажется.
      Я поступал проще. Я вел лог успешных сидов. То есть если сидом воспользовались я записал это в лог, а самую старую запись стер. Получалась своеобразная ротация сидов.
      В итоге. При генерировании капчи никаких записей не создается. Запись происходит только после успешной проверки. Этим самым бы недаем засрать базу или папку с сессиями.
      Имхо самый идеальный вариант в плане производительности.

  3. Artem

    Привет, а какой редактор ты используешь для рисования картинок к статьям? Вроде на Visio не похоже.

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

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.