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

Сказать, что капча всем надоела и очень многих раздражает — значит ничего не сказать. Проблема еще в том, что очень и очень многие используют «облачную» капчу от одной всемирно известной корпорации... и в случае проблем с доступом к такой капче (тьфу-тьфу-тьфу) львиная доля использующих ее сайтов просто перестанет работать.

Ниже — простейший альтернативный вариант защиты от автоматической отправки сообщений и от брутфорса логина/пароля, основанный на идее PoW (proof of work, доказательство выполнения работы).

Что такое PoW

Идея PoW хорошо знакома разработчикам и пользователям криптовалютных систем и впервые была предложена, по-видимому, в 1993 году профессором Гарвардского университета, сотрудницей Microsoft Синтией Дворк (Cynthia Dwork) и израильским профессором Мони Наором (Moni Naor). Идея чрезвычайно проста: мы придумываем задачу, требующую значительных вычислительных ресурсов и процессорного времени на клиенте, но такую, что результат ее решения легко проверяется на сервере. Тем самым хакеру, от которого требуется отправить на сервер этот самый результат для получения определенных прав, потребуется существенное время, что сведет его хакерские усилия к нулю.

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

Реализация

Нам потребуется реализация алгоритма sha1 на javascript; соответствующий скрипт (в разных вариантах) можно с легкостью найти на GitHub. Далее мы пишем совсем простенький собственный скриптик:

const pow16 = str => {
   let res = '', n = 0;
   while(res != "abcd") {
      res = sha1(sha1(n.toString()) + str).substr(15, 4);
      n++;
      if (n > 1e6) return;
   }
   return n - 1;
}

Для проверки его работоспособности и временнЫх характеристик можно использовать, например, вот такую демо-страничку (pow16.js — файл с нашим самодельным скриптом):

<!DOCTYPE html><html><head><meta charset="utf-8"></head>
<body>
<p><input id="str" placeholder="Строка"></p>
<p><input id="nnc" placeholder="Результат"></p>
<p><input id="dur" value="0 ms"></p>
<p><button type="button" onclick="goPow()">Go!</button></p>
<script src="sha1.js"></script>
<script src="pow16.js"></script>
<script>"use strict";
const goPow = () => {
   let str = document.querySelector("#str").value;
   let tm = (new Date()).getTime();
   let res = pow16(str);
   let dur = (new Date()).getTime() - tm;
   document.querySelector("#nnc").value = res;
   document.querySelector("#dur").value = dur + " ms";
}
</script></body></html>

Определенная в скрипте функция pow16(str) хеширует входную строку str сначала с солью sha1('0'), затем с солью sha1('1') и так далее до тех пор, пока 15–18-е цифры (всего 16 бит, отсюда и название функции) полученного хеша не станут равны 'abcd'. Конечно, можно взять и любой другой участок хеша, а не обязательно 15–18-е цифры (и не обязательно 'abcd', конечно). Величина 16 бит (четыре цифры хеша) получена опытным путем: 3 цифры это мало (такой скрипт выполняется практически мгновенно), а 5 цифр уже много (браузер просто виснет). Желающие, безусловно, могут поэкспериментировать с количеством бит, не кратным 4.

Функция возвращает натуральное число — количество итераций, потребовавшихся для достижения результата. В случае, если за миллион итераций результат не достигнут, возвращается undefined. Демо-страничка позволяет протестировать скрипт, показывая количество затраченного на его выполнение времени при различных входных строках.

Использование вместо капчи

Идея использования приведенной выше реализации идеи PoW вместо капчи очень проста. При отправке данных формы (например, с парой логин/пароль, с сообщением чата и т. п.) мы на клиенте вычисляем pow16 от отправляемых данных (назовем эту величину контрольным числом) и вместе с этими данными посылаем на сервер. На серверной стороне (ниже приведен пример на php) мы проверяем соответствие контрольного числа $n пришедшим данным $str и в случае несоответствия отказываем в авторизации (в приеме сообщения форума и т. п.):

if (substr(sha1(sha1($n).$str), 15, 4) != "abcd") {
   // отказываем в авторизации или ином действии
}

Замечательно, что такая реализация «антихакерской» защиты, в отличие от капчи, не требует от пользователя никаких действий и практически незаметна для него. Разумно сделать кнопку отправки формы по умолчанию неактивной, активизируя ее только после окончания вычисления контрольного числа.

Тестирование и проблемы

Приведенный выше скрипт тестировался в браузере Firefox 78.12.0esr из-под ОС Debian 10 (4.19.194-3 x86_64) на компьютере с процессором Intel Core m3-7Y30 CPU 1 GHz и оперативной памятью 4 ГБ. Среднее время выполнения скрипта составило около 1 с; разброс — от 50 мс до 4 с в зависимости от входной строки. Такое время задержки решает поставленную задачу: позволяет значительно снизить эффективность брутфорса логина и пароля либо отправку автоматических сообщений в чатах или на форумах. Тестировать скрипт в других браузерах из-под других ОС и на других компьютерах мне было лень :)

Конечно, скажет въедливый читатель, хакер может взять суперкомпьютер, выполняющий этот скрипт за доли миллисекунды, и с легкостью преодолеть всю эту вашу технологию PoW. Это, безусловно, так; справедливости ради лишь замечу, что на суперкомпьютере и практически любая капча ломается достаточно быстро. Понятно, что предложенный способ замены капчи на менее раздражающую пользователя технологию PoW годится лишь для некритичных случаев, когда взлом защиты не является фатальным.

Комментарии (71)


  1. tempick
    28.09.2021 20:15
    +1

    Добавьте шорт-кат, пожалуйста


    1. amg0461 Автор
      28.09.2021 20:22
      +1

      Что-то новый редактор у меня не распознал markdown :) Сейчас попробую.


    1. amg0461 Автор
      28.09.2021 20:36

      del


  1. Skpd
    28.09.2021 20:15
    +1

    Больше похоже на CSRF защиту, чем на каптчу.


    1. amg0461 Автор
      28.09.2021 20:25

      Так да, это некий аналог токена, только с технологией PoW, которую я предлагаю использовать вместо капчи.


      1. vlreshet
        28.09.2021 23:49

        [del]


  1. Layan
    28.09.2021 20:25

    Интересная штука. Но такое решение - довольно легко обойти кодом.

    Мы использовали более интересный алгоритм внутри WASM. Изначально идею взяли из этой библиотеке, но изменили алгоритм.

    https://www.npmjs.com/package/pow-wasm


    1. amg0461 Автор
      28.09.2021 20:38

      А как обойти кодом?


      1. vlreshet
        28.09.2021 23:49
        +1

        Да хотя бы — перенести алгоритм генерации PoW на «свою» сторону. Например, делают какие-то плохие штуки с вашим сайтом, используя код на PHP. В чём проблема перенести алгоритм на PHP, и считать его у себя?) А вам уже отправлять токен, да. Бекенд же не сможет проверить кто его вычислил — js клиент, или бот.

        Ну и второй вариант — headless браузеры. Они такую защиту вообще не заметят, будто и нет её.


        1. amg0461 Автор
          29.09.2021 00:11
          +1

          А какая разница, где его считать? Время же все равно для этого потребуется. Нет, ну ясно, что можно считать на квантовом компьютере в МГУ :) Но я и пишу, что это защита не от суперхакера с супероборудованием, а лишь для простых случаев.

          Про headless браузеры не в курсе, если честно. На сервер же все равно контрольное число должно прийти, хоть какой браузер. Можно просто сокет с помощью С на клиентской стороне открыть и послать запрос на сервер вообще без всякого браузера, это не важно.


          1. BeMySlaveDarlin
            29.09.2021 06:58

            Смысл теряется, когда хакер, вычислив алгоритм, в своем скрипте генерирует необходимые пары str + pow заранее, а потом без ожидания отправляет.


            1. amg0461 Автор
              29.09.2021 10:10

              Против этого хорошо работает отправка инициализирующего значения с сервера (с записью его в сессию), как и в случае традиционной капчи. Даже в таком варианте PoW будет удобнее для пользователя, потому что ему не надо будет ничего вводить.


            1. DreamingKitten
              29.09.2021 10:10

              Rainbow tables, да.

              Но если варьировать позицию подстроки, то это не поможет.


              1. DKursk
                29.09.2021 10:39

                Или менять содержание подстроки.


      1. ifightwithwall
        25.10.2021 17:41

        Прошу прощения, хабр запретил мне отвечать на прошлые темы( причин не знаю)У вас есть статья про изготовление эцп( не квалифицированной) подскажите пожалуйста вот я сгенерировал приватный и публичный ключи как потом этим пользоваться, просить отразить это в каком то акте, договоре? Чтобы не квалифицированная эцп имело юридическую силу?Интересует пример устройства на работу удаленно, как мне пользоваться такой подписью при докумобороте.Буду признателен если дополните сведения.Спасибо.


        1. amg0461 Автор
          25.10.2021 17:50

          Начну с конца: как пользоваться. В статье, собственно, про это написано. Размещаете на своем сайте страничку, с помощью которой ваш контрагент может проверить подпись. Для изготовления подписи сначала хешируете документ, а потом подписываете хеш (возможно, с некоей дополнительной информацией) приватным ключом. Сам документ и полученную таким образом подпись отсылаете контрагенту. Он заходит на страничку проверки на вашем сайте, загружает документ и подпись. Ваш сервер расшифровывает подпись с помощью открытого ключа, делает хеш загруженного документа и сверяет его с расшифрованным хешем. В случае успеха сообщает, что подпись подлинная.

          Теперь о юридической стороне. В соответствии с пунктом 2 статьи 6 Федерального закона от 06.04.2011 № 63-ФЗ «Об электронной подписи» неквалифици­рованная электронная подпись признается равнозначной собственноручной подписи в случае достигнутого соглашения между участниками электронного взаимодействия. Думаю, что вы с контрагентом должны заключить некое письменное соглашение, в котором написано, что вы взаимно признаете электронные подписи друг друга и описан механизм, который я изложил выше.


  1. lorc
    28.09.2021 20:34
    +6

    Особенно хороша она будет на baterry-powered устройствах. С которых нынче сидит большая часть пользователей интернета.


    1. amg0461 Автор
      28.09.2021 20:42
      +2

      Да ну, речь о секунде-двух процессорного времени всего. Это же не майнинг, жрущий энергию.


      1. saege5b
        29.09.2021 23:57

        Это смотря что взять за систему по умолчанию, можно взять 32 ядра/64 потока,128 Гб, 2 GPU.

        С запасом, на вырост.

        И смарты разные бывают, и секунда час бережёт.


  1. ultrinfaern
    28.09.2021 21:44
    +13

    Смысл капчи это проверить что на той стороне человек а не вычислительная система, и это PoW решить ни как не сможет.

    То что вы предложили, это просто таймауты при валидации, но таймауты в разных вариациях уже везде используют.


    1. amg0461 Автор
      28.09.2021 22:04
      +2

      У капчи много смыслов, проверка «человечности» ведь важна не сама по себе, а для решения какой-то конкретной задачи. Про таймаут согласен, я просто предложил одно из решений реализации таймаута на клиентской стороне, которое не обходится кодом на клиенте.


      1. nochkin
        28.09.2021 23:35
        +5

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

        То есть, в данном случае такая "капча" эту проблему не решает.

        Честно говоря, я прикинул и не знаю какие другие проблемы может решить этот вариант.


        1. amg0461 Автор
          28.09.2021 23:44

          Ну почему, время тайматуа, обеспечиваемое этим скриптом, сопоставимо со временем решения традиционной капчи человеком (или взлома ее клиентским софтом). А другие проблемы — это брутфорс логина/пароля.


          1. nochkin
            29.09.2021 00:12
            +2

            Верно. Проблема не в скорости создания левых аккаунтов, а в автоматизации процесса.

            Если сотню аккаунтов можно создать за 10 минут или за 15 минут, то это не так критично. Фишка в том, что бы это автоматизировать.

            Потом можно этими аккаунтами рассылать спам на форуме или до чего ещё руки дотянутся. Пароли ведь известные.


      1. masai
        03.10.2021 13:25

        А чем это лучше таймаута на серверной стороне? Он тоже не обходится кодом на клиенте.


        1. cepera_ang
          03.10.2021 13:57

          Зато обходится конвейеризацией — спамер может отправлять сколько угодно запросов с небольшим промежутком и ему пофиг на таймаут, ведь главное не когда исполнится запрос, а сам факт исполнения. В случае с PoW придётся потратить ресурсы на каждый запрос, а чтобы отправить тысячу в параллель нужно будет иметь тысячу ядер в параллель.


        1. amg0461 Автор
          03.10.2021 16:07

          На серверной стороне таймаут организовывать не всегда удобно, особенно в асинхронных средах типа nodejs, можно нечаянно затормозить основной цикл событий. Кроме того, на серверной стороне придется сначала лезть в базу, аутентифицировать клиента и только потом (в случае неудачи) делать паузу, в то время как на клиенте пауза методом PoW делается до отправки запроса и не нагружает сервер.


  1. Goodwinnew
    28.09.2021 22:20

    самая простая и тупая капча - "какой сейчас год" и 4 цифры ввода - но длину ввода не ограничивать.. и в поле ввода образец "1913"

    90% ботов понимают вариант "сколько будет 2+3" и не понимают полностью текстовый вопрос без цифр. это уже ИИ нужен или бота заранее на такой вопрос настроить.

    но у меня работает. за два года ни одного бота не прошло. 50% ботов тупо берут ответ из подсказки в форме :) я их потом в логах вижу.

    1913

    11111

    1111111

    12345

    123456

    так сказать - решение на коленке.

    и да - после третьей попытки fail2ban отправляет IP в бан на неделю.


    1. amg0461 Автор
      28.09.2021 22:25

      Так не только в ботах же решаемая моим вариантом проблема, а и в людях-хакерах, перед которыми стоит задача написать клиентский код, брутфорсящий сервис авторизации, например. Ваш вариант отсеивает ботов, но не отсеивает злонамеренных людей.


      1. Goodwinnew
        28.09.2021 22:32

        согласен.

        если стоит вопрос сломать вход в конкретном сайте - то с привлечением людей быстро сломают.

        а вот если вопрос - написать универсальный код для взлома - тут на порядок сложнее. вопрос текстовый, ответ цифровой, подсказка цифровая. стандартный бот анализирует что может - и получает бан.

        но конечно - вопрос времени. пока ни одного бота не прошло. все-таки это не 22 порт, где китайские сервера дают 10-20 запросов в секунду.


        1. DGN
          29.09.2021 05:24
          +2

          У меня в 2005 году на форуме была подобная самописная защита, сложить все красные числа и задачка вида 5+3*2-1, при этом некоторые цифры были зеленые и черные, но две красные. Очень успешно все это работало года 3-4, потом сломали! Форум не очень популярный, так что сломали не прицельно (да и спам не был прицельным).

          Предложенный в статье метод целей своих не достигнет, потому как спамеры заплатят компьютерным временем. Они платят и индусам за прохождение капчей. До кучи некоторые антивирусы скрипты похожие на майнинг прибивают, люди просто не смогут зайти.

          КМК капча скоро умрет сама собой, потому что ИИ сравнялся уже по капчеразгадывательным возможностям с человеком, и сделать капчу проходимую всеми людьми и непроходимую ботами невозможно.


          1. cepera_ang
            29.09.2021 07:26
            +2

            и сделать капчу проходимую всеми людьми и непроходимую ботами невозможно.

            Нужно просто ввести оплату за доступ к ресурсам. Десятая доля цента для человека — ерунда, а для бота или спамера — сделает всю операцию убыточной.


            1. DGN
              29.09.2021 09:18
              +2

              Сейчас спамеры платят порядка 2р за капчу, это 3 цента. Будут ли пользователи платить за регистрацию хотя бы 10р, не везде, но пусть. Сервиса на такие микротранзакции пока что, общедоступного (чтобы у всех уже был) и общеудобного (чтобы оплатить было быстрее и удобнее чем разгадывать) нет.

              А так, пайвол это тема будущего.


      1. nochkin
        28.09.2021 23:38

        Если надо просто решить проблему брут-форса, то достаточно сделать задержку на стороне сервера при неудачных попытках.

        Иначе js можно обойти обычным POST-запросом через тот же curl.


        1. amg0461 Автор
          28.09.2021 23:50

          Задержка на стороне сервера не всегда удобно реализуема, например, на nodejs (в отличие от php, где можно синхронно любую паузу делать).

          Про post-запрос не понял, на сервер ведь надо будет в любом случае отправлять контрольное число, вычисленное по алгоритму PoW, а вычисление этого числа на клиенте потребует времени. Тут не важно, curl'ом мы отправляем или браузером: сервер при неверном контрольном числе просто отвергнет такой запрос.


          1. nochkin
            28.09.2021 23:54

            Я про то, что можно отправлять одно и то же число, которое было вычислено уже заранее один раз.

            Иначе надо будет хранить использованные варианты на стороне сервера.

            P.S.: уже не помню как делать серверную часть на NodeJS. Но разве там нет того же setInterval, который через callback отправит 200? Или там совсем всё по-другому? Я просто плохо знаком с этим.


            1. amg0461 Автор
              28.09.2021 23:59

              Смысл брутфорса же в том, что мы перебираем разные пароли. Тогда и контрольные числа будут разные, ломать с одним и тем же контрольным числом не получится. Если речь о защите от автоматических постов, можно, как вы пишете, с сервера (как и при реализации традиционной капчи) отправлять некую соль, записывая ее одновременно в сессию. При проверке контроьного числа брать эту соль из сессии.

              На ноде можно, конечно, запустить что-то на пару секунд, и по окончании этих секунд вызвать коллбэк, но зачем такой геморрой? Пауза на клиенте с идеей PoW гораздо проще, мне кажется.


              1. nochkin
                29.09.2021 00:07

                Там соль/hash от полей ввода зависит, получается. Я этот момент пропустил.

                Пожалуй, такой use-case ещё куда ни шло. Но тут проще по IP блок поставить на мой взгляд. Разница в том, что в варианте PoW можно всё сделать на клиенте.


              1. Tangeman
                30.09.2021 00:33

                Пауза на клиенте с идеей PoW гораздо проще, мне кажется.

                Пауза — это открытое соединение, ценный ресурс. Гораздо проще по достижении лимита вплоть до исчерпания времени паузы все запросы отбивать с кодами 429 или 503 и установкой заголовка Retry-After для индикации оставшегося времени ожидания, а особо упорных (которые продолжают слать запросы до его истечения) — банить жёстко.


                Хотя, честно говоря, все эти ожидания и прочие лимиты, включая PoW мало помогают против "продвинутых" ломателей — ко мне приходили целые полчища ботов, притворялись полноценными клиентами (js, все дела) — в логах это видно как один-два запроса в секунду на логин, с одного IP пробуют ровно одну пару, максимум две — и он не пытается больше в ближайшие сутки. Да, скорость перебора так себе, но оно ж кушать не просит и не торопится, а банить — по какому критерию? Настоящие пользователи тоже ошибаются, в час обычно парочка пробует с пяток имен-паролей к своим аккаунтам — потому что забывают либо пароли либо как именно зарегистрированы.


                1. amg0461 Автор
                  30.09.2021 11:08

                  Пауза — это открытое соединение, ценный ресурс.

                  PoW на клиенте производится до отправки запроса на сервер, никакого открытого соединения. По поводу того, что против лома нет приема — так оно, с этим никто не спорит.


    1. alex_shpak
      28.09.2021 23:13
      +4

      Интересная идея!

      Я в своё время по примеру этой статьи сделал поле <input name="email"> и скрыл его через CSS. Человеческие посетители оставляли его пустым, а боты заполняли.


      1. SergeiMinaev
        29.09.2021 03:04
        +3

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


        1. Goodwinnew
          29.09.2021 10:58
          +1

          а вот это хорошо :)


      1. DKursk
        29.09.2021 10:52
        +1

        Помимо ботов это может сделать автозаполнение форм. В приведенной статье используется поле с другим названием.


      1. Goodwinnew
        29.09.2021 10:57
        +1

        уже не работает в 50% случаев

        бот анализирует (что увидит пользователь) и не заполняет скрытые поля

        ps

        50% - из моих логов видно статистику


    1. pingo
      28.09.2021 23:17
      +2

      у меня до сих пор работает <input name=url /> скрытый в css от хуманов, лог ботов уже километровый за 7 лет. как перестанет работать, воткну капчу


      1. amg0461 Автор
        28.09.2021 23:52
        +2

        Ну моя идея решает задачу не столько защиты от ботов (скрытое поле это классическое решение), сколько защиты от хакера и брутфорса.


    1. ifap
      29.09.2021 00:33

      Видимо, Ваш сайт просто не интересен ботам ;) У меня на форуме капча — вопрос на знание поговорок, ответ вообще нигде не подсказан, но раз в ~полгода приходится вопросы менять, т.к. спамеры заходят, вручную вбивают ответ в свою базу, и снова здарова!


      1. Goodwinnew
        29.09.2021 10:47

        можно вопрос картинкой сделать :)

        конечно - человек и вопрос прочитает и ответ правильный сделает.

        а как бот вопрос прочитает? да, OCR есть. как именно бот узнает, в какой картинке вопрос?

        прогонять все картинки через OCR.....замучается пыль глотать ©

        надо целый модуль спамерам уже писать - что вот в этой картинке вопрос, его надо через OCR прогнать и вытащить этому вопросу правильный ответ из своей базы

        ps

        все-таки надо разделять спамеров и взломщиков. спамеры в основном по площадям работают и иногда дописывают своего бота, что бы % размещения был выше.

        а взлом - другое дело. тут уже целевая атака на конкретную защиту.

        pss

        и да - у меня ответ на вопрос 1го января ежегодно сам меняется :)


        1. amg0461 Автор
          29.09.2021 10:52

          Проблема все же не столько в ботах (от них защититься более или менее понятно как), а в живых людях, которые поставили себе задачу сломать вашу капчу. Написать программу, распознающую вашу картинку, под силам даже школьнику (ну ладно, первокурснику). А уж один и тот же ответ на вопрос в течение года вообще от хакера никак не защищает. Ну вы и сами это понимаете.


          1. Goodwinnew
            29.09.2021 11:10

            :)

            там мы же с не хакерами боремся. а с тупыми программерами, которые создают тупых ботов.

            мой рекорд - 500 писем в час (через форму) на тему открытия торгового центра в Пекине (Китай), текст на иероглифах (перевел через гугль), email случайно сгенерирован, IP каждый раз разный.

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

            пришлось ваять защиту на коленке.

            и защиту от наличия иероглифов в тесте сообщения добавил, сообщение в форме на иероглифах теперь в принципе не отправляется


            1. amg0461 Автор
              29.09.2021 11:13

              там мы же с не хакерами боремся. а с тупыми программерами, которые создают тупых ботов.

              Как раз моя статья посвящена борьбе именно с хакерами, а не с ботами.


        1. ifap
          29.09.2021 14:08

          В данном случае если вопрос картинкой, то спамеры не будут мутить OCR, они просто будут считывать первые N байтов файла с картинкой, идентифицируя вопрос таким образом ;)


  1. pil0t
    28.09.2021 22:49
    +2

    Идея интересная, но в текущем виде защита только от script kiddies

    Основная проблема - разница в производительности недорогого смартфона 3-4 летней давности и современных ASIC майнеров "числодробилок", тут либо на смартфоне будет задержка в несколько минут и несколько процентов батареи, либо защита очень слабая.


    1. amg0461 Автор
      28.09.2021 22:54

      Можно, например, в цикле while в моем скрипте опрашивать время, прошедшее с начала его выполнения, и при превышении времени более 5 с, например, выдавать традиционную капчу. Ну и понятно, что подбор количества бит, совпадения которых мы требуем в итоговом хеше, будет меняться со временем, ориентируясь на средние по производительности клиентские девайсы. Но я согласен с вами, предложена лишь идея, которую можно дорабатывать.


      1. Layan
        29.09.2021 16:39
        +1

        Можно в зависимости от устройства (User-Agent) делать разную сложность. Только в таком случае лучше это в WASM засунуть — тогда большинство «хакеров» не смогут вычислить точный алгоритм.
        Но это security through obscurity.


  1. Mox
    29.09.2021 00:50
    +1

    Я так и не понял как это защищает от ботов.


    Я завожу Selenium, через селекторы заполняю поля, нажимаю "отправить". Что не сработает то?


    1. amg0461 Автор
      29.09.2021 10:13

      Хоть Selenium, хоть другие средства автоматизации — предложенное решение резко снижает количество попыток брутфорса или авторегистраций в секунду. Полной защиты от ботов это не дает, конечно (впрочем, как и капча, которая сегодня взламывается за сопоставимое время).


  1. SergeiMinaev
    29.09.2021 03:11
    +1

    Идея-то интересная, но если уж всё равно надо ждать N секунд, то проще банально сделать sleep(N) на сервере :)


    1. amg0461 Автор
      29.09.2021 10:15

      Не всегда это удобно, особенно в асинхронных средах типа nodejs. На клиентской стороне проще.


    1. Goodwinnew
      29.09.2021 10:52
      +1

      sleep не получится - так как бот умеет динамически IP менять, пока один IP будет ждать, с другого зайдут.

      тут именно задержка на клиентской машине от ввода данных до возможности их отправить. - придется ждать в любом случае.

      а если еще кнопку "отправить" рисовать JS через 1 сек = то 90% ботов вообще выпадет, они тупо через парсинг html работают, без запуска JS и кнопку они вообще не увидят


      1. amg0461 Автор
        29.09.2021 10:58

        Так можно вообще всю форму отправки сообщения нарисовать с помощью createElement(). Но не в ботах основная проблема.


      1. amg0461 Автор
        29.09.2021 11:10

        Кстати насчет ботов. Я уже давно не использую тег <form>, а просто отправляю значения всех полей на сервер fetch-запросом. И все боты нервно курят в сторонке.


        1. PaulZi
          29.09.2021 14:54

          У вас просто были тупые боты) Сейчас все чаще selenium используют.


  1. cepera_ang
    29.09.2021 05:15

    История сделала полный оборот и вы вдохновленный видимо криптовалютами придумали Hashcash, который в свою очередь вдохновил создателя биткоина :)


    1. amg0461 Автор
      29.09.2021 10:15

      Так не придумал, а позаимствовал :)


  1. lavrok
    29.09.2021 10:17
    +2

    Могу дополнить, что данный механизм можно усовершенствовать, повысив производительность вычислений для "нормального" клиента делая их внутри WASM. Скорость вычислений будет в разы выше, а значит можно поднять сложность алгоритма и добавив тем самым сложности недобросовестным переборщикам.
    Также хорошей практикой будет вынести вычисления в отдельный воркер, что бы не блокировать основной поток.


  1. zkrvndm
    29.09.2021 10:17
    +1

    Согласно моему опыту, лучшая капча - это отслеживание браузерных событий. Запись событий должна соответствовать определенному паттерну: прокрутка вниз, движения мыши, клики по полям ввода.


  1. pfffffffffffff
    29.09.2021 10:38

    Мне кажется или капча лучше отсеивает ботов чем ваше решение


    1. amg0461 Автор
      29.09.2021 10:43

      Трудно сказать. Смотря какая капча (насколько она поддается взлому с помощью ИИ), смотря какая реализация моего решения (алгоритмы PoW могут быть очень и очень разными). Масштабного сравнительного тестирования же никто не делал.


  1. gameplayer55055
    30.09.2021 11:44

    С такой инновацией я со своего старого бука никуда не зайду. Или зайду, но полчаса будет хеш считать :)