Для чего обычно используется капча? Для защиты от автоматических регистраций (либо автоматической отправки сообщений на форумах, в чатах, через форму обратной связи и т. п.) и для предотвращения брутфорса пары логин/пароль при аутентификации. Более экзотические случаи ее использования достаточно редки.
Сказать, что капча всем надоела и очень многих раздражает — значит ничего не сказать. Проблема еще в том, что очень и очень многие используют «облачную» капчу от одной всемирно известной корпорации... и в случае проблем с доступом к такой капче (тьфу-тьфу-тьфу) львиная доля использующих ее сайтов просто перестанет работать.
Ниже — простейший альтернативный вариант защиты от автоматической отправки сообщений и от брутфорса логина/пароля, основанный на идее 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)
Layan
28.09.2021 20:25Интересная штука. Но такое решение - довольно легко обойти кодом.
Мы использовали более интересный алгоритм внутри WASM. Изначально идею взяли из этой библиотеке, но изменили алгоритм.
amg0461 Автор
28.09.2021 20:38А как обойти кодом?
vlreshet
28.09.2021 23:49+1Да хотя бы — перенести алгоритм генерации PoW на «свою» сторону. Например, делают какие-то плохие штуки с вашим сайтом, используя код на PHP. В чём проблема перенести алгоритм на PHP, и считать его у себя?) А вам уже отправлять токен, да. Бекенд же не сможет проверить кто его вычислил — js клиент, или бот.
Ну и второй вариант — headless браузеры. Они такую защиту вообще не заметят, будто и нет её.amg0461 Автор
29.09.2021 00:11+1А какая разница, где его считать? Время же все равно для этого потребуется. Нет, ну ясно, что можно считать на квантовом компьютере в МГУ :) Но я и пишу, что это защита не от суперхакера с супероборудованием, а лишь для простых случаев.
Про headless браузеры не в курсе, если честно. На сервер же все равно контрольное число должно прийти, хоть какой браузер. Можно просто сокет с помощью С на клиентской стороне открыть и послать запрос на сервер вообще без всякого браузера, это не важно.
BeMySlaveDarlin
29.09.2021 06:58Смысл теряется, когда хакер, вычислив алгоритм, в своем скрипте генерирует необходимые пары str + pow заранее, а потом без ожидания отправляет.
amg0461 Автор
29.09.2021 10:10Против этого хорошо работает отправка инициализирующего значения с сервера (с записью его в сессию), как и в случае традиционной капчи. Даже в таком варианте PoW будет удобнее для пользователя, потому что ему не надо будет ничего вводить.
DreamingKitten
29.09.2021 10:10Rainbow tables, да.
Но если варьировать позицию подстроки, то это не поможет.
ifightwithwall
25.10.2021 17:41Прошу прощения, хабр запретил мне отвечать на прошлые темы( причин не знаю)У вас есть статья про изготовление эцп( не квалифицированной) подскажите пожалуйста вот я сгенерировал приватный и публичный ключи как потом этим пользоваться, просить отразить это в каком то акте, договоре? Чтобы не квалифицированная эцп имело юридическую силу?Интересует пример устройства на работу удаленно, как мне пользоваться такой подписью при докумобороте.Буду признателен если дополните сведения.Спасибо.
amg0461 Автор
25.10.2021 17:50Начну с конца: как пользоваться. В статье, собственно, про это написано. Размещаете на своем сайте страничку, с помощью которой ваш контрагент может проверить подпись. Для изготовления подписи сначала хешируете документ, а потом подписываете хеш (возможно, с некоей дополнительной информацией) приватным ключом. Сам документ и полученную таким образом подпись отсылаете контрагенту. Он заходит на страничку проверки на вашем сайте, загружает документ и подпись. Ваш сервер расшифровывает подпись с помощью открытого ключа, делает хеш загруженного документа и сверяет его с расшифрованным хешем. В случае успеха сообщает, что подпись подлинная.
Теперь о юридической стороне. В соответствии с пунктом 2 статьи 6 Федерального закона от 06.04.2011 № 63-ФЗ «Об электронной подписи» неквалифицированная электронная подпись признается равнозначной собственноручной подписи в случае достигнутого соглашения между участниками электронного взаимодействия. Думаю, что вы с контрагентом должны заключить некое письменное соглашение, в котором написано, что вы взаимно признаете электронные подписи друг друга и описан механизм, который я изложил выше.
lorc
28.09.2021 20:34+6Особенно хороша она будет на baterry-powered устройствах. С которых нынче сидит большая часть пользователей интернета.
amg0461 Автор
28.09.2021 20:42+2Да ну, речь о секунде-двух процессорного времени всего. Это же не майнинг, жрущий энергию.
saege5b
29.09.2021 23:57Это смотря что взять за систему по умолчанию, можно взять 32 ядра/64 потока,128 Гб, 2 GPU.
С запасом, на вырост.
И смарты разные бывают, и секунда час бережёт.
ultrinfaern
28.09.2021 21:44+13Смысл капчи это проверить что на той стороне человек а не вычислительная система, и это PoW решить ни как не сможет.
То что вы предложили, это просто таймауты при валидации, но таймауты в разных вариациях уже везде используют.
amg0461 Автор
28.09.2021 22:04+2У капчи много смыслов, проверка «человечности» ведь важна не сама по себе, а для решения какой-то конкретной задачи. Про таймаут согласен, я просто предложил одно из решений реализации таймаута на клиентской стороне, которое не обходится кодом на клиенте.
nochkin
28.09.2021 23:35+5Пожалуй, одна из самых популярных целей капчи -- ограничить автоматическую использования формы (создание аккаунтов, рассылка сообщений, защита от спама и т.п.).
То есть, в данном случае такая "капча" эту проблему не решает.
Честно говоря, я прикинул и не знаю какие другие проблемы может решить этот вариант.
amg0461 Автор
28.09.2021 23:44Ну почему, время тайматуа, обеспечиваемое этим скриптом, сопоставимо со временем решения традиционной капчи человеком (или взлома ее клиентским софтом). А другие проблемы — это брутфорс логина/пароля.
nochkin
29.09.2021 00:12+2Верно. Проблема не в скорости создания левых аккаунтов, а в автоматизации процесса.
Если сотню аккаунтов можно создать за 10 минут или за 15 минут, то это не так критично. Фишка в том, что бы это автоматизировать.
Потом можно этими аккаунтами рассылать спам на форуме или до чего ещё руки дотянутся. Пароли ведь известные.
masai
03.10.2021 13:25А чем это лучше таймаута на серверной стороне? Он тоже не обходится кодом на клиенте.
cepera_ang
03.10.2021 13:57Зато обходится конвейеризацией — спамер может отправлять сколько угодно запросов с небольшим промежутком и ему пофиг на таймаут, ведь главное не когда исполнится запрос, а сам факт исполнения. В случае с PoW придётся потратить ресурсы на каждый запрос, а чтобы отправить тысячу в параллель нужно будет иметь тысячу ядер в параллель.
amg0461 Автор
03.10.2021 16:07На серверной стороне таймаут организовывать не всегда удобно, особенно в асинхронных средах типа nodejs, можно нечаянно затормозить основной цикл событий. Кроме того, на серверной стороне придется сначала лезть в базу, аутентифицировать клиента и только потом (в случае неудачи) делать паузу, в то время как на клиенте пауза методом PoW делается до отправки запроса и не нагружает сервер.
Goodwinnew
28.09.2021 22:20самая простая и тупая капча - "какой сейчас год" и 4 цифры ввода - но длину ввода не ограничивать.. и в поле ввода образец "1913"
90% ботов понимают вариант "сколько будет 2+3" и не понимают полностью текстовый вопрос без цифр. это уже ИИ нужен или бота заранее на такой вопрос настроить.
но у меня работает. за два года ни одного бота не прошло. 50% ботов тупо берут ответ из подсказки в форме :) я их потом в логах вижу.
1913
11111
1111111
12345
123456
так сказать - решение на коленке.
и да - после третьей попытки fail2ban отправляет IP в бан на неделю.
amg0461 Автор
28.09.2021 22:25Так не только в ботах же решаемая моим вариантом проблема, а и в людях-хакерах, перед которыми стоит задача написать клиентский код, брутфорсящий сервис авторизации, например. Ваш вариант отсеивает ботов, но не отсеивает злонамеренных людей.
Goodwinnew
28.09.2021 22:32согласен.
если стоит вопрос сломать вход в конкретном сайте - то с привлечением людей быстро сломают.
а вот если вопрос - написать универсальный код для взлома - тут на порядок сложнее. вопрос текстовый, ответ цифровой, подсказка цифровая. стандартный бот анализирует что может - и получает бан.
но конечно - вопрос времени. пока ни одного бота не прошло. все-таки это не 22 порт, где китайские сервера дают 10-20 запросов в секунду.
DGN
29.09.2021 05:24+2У меня в 2005 году на форуме была подобная самописная защита, сложить все красные числа и задачка вида 5+3*2-1, при этом некоторые цифры были зеленые и черные, но две красные. Очень успешно все это работало года 3-4, потом сломали! Форум не очень популярный, так что сломали не прицельно (да и спам не был прицельным).
Предложенный в статье метод целей своих не достигнет, потому как спамеры заплатят компьютерным временем. Они платят и индусам за прохождение капчей. До кучи некоторые антивирусы скрипты похожие на майнинг прибивают, люди просто не смогут зайти.
КМК капча скоро умрет сама собой, потому что ИИ сравнялся уже по капчеразгадывательным возможностям с человеком, и сделать капчу проходимую всеми людьми и непроходимую ботами невозможно.
cepera_ang
29.09.2021 07:26+2и сделать капчу проходимую всеми людьми и непроходимую ботами невозможно.
Нужно просто ввести оплату за доступ к ресурсам. Десятая доля цента для человека — ерунда, а для бота или спамера — сделает всю операцию убыточной.
DGN
29.09.2021 09:18+2Сейчас спамеры платят порядка 2р за капчу, это 3 цента. Будут ли пользователи платить за регистрацию хотя бы 10р, не везде, но пусть. Сервиса на такие микротранзакции пока что, общедоступного (чтобы у всех уже был) и общеудобного (чтобы оплатить было быстрее и удобнее чем разгадывать) нет.
А так, пайвол это тема будущего.
nochkin
28.09.2021 23:38Если надо просто решить проблему брут-форса, то достаточно сделать задержку на стороне сервера при неудачных попытках.
Иначе js можно обойти обычным POST-запросом через тот же curl.
amg0461 Автор
28.09.2021 23:50Задержка на стороне сервера не всегда удобно реализуема, например, на nodejs (в отличие от php, где можно синхронно любую паузу делать).
Про post-запрос не понял, на сервер ведь надо будет в любом случае отправлять контрольное число, вычисленное по алгоритму PoW, а вычисление этого числа на клиенте потребует времени. Тут не важно, curl'ом мы отправляем или браузером: сервер при неверном контрольном числе просто отвергнет такой запрос.
nochkin
28.09.2021 23:54Я про то, что можно отправлять одно и то же число, которое было вычислено уже заранее один раз.
Иначе надо будет хранить использованные варианты на стороне сервера.
P.S.: уже не помню как делать серверную часть на NodeJS. Но разве там нет того же setInterval, который через callback отправит 200? Или там совсем всё по-другому? Я просто плохо знаком с этим.
amg0461 Автор
28.09.2021 23:59Смысл брутфорса же в том, что мы перебираем разные пароли. Тогда и контрольные числа будут разные, ломать с одним и тем же контрольным числом не получится. Если речь о защите от автоматических постов, можно, как вы пишете, с сервера (как и при реализации традиционной капчи) отправлять некую соль, записывая ее одновременно в сессию. При проверке контроьного числа брать эту соль из сессии.
На ноде можно, конечно, запустить что-то на пару секунд, и по окончании этих секунд вызвать коллбэк, но зачем такой геморрой? Пауза на клиенте с идеей PoW гораздо проще, мне кажется.
nochkin
29.09.2021 00:07Там соль/hash от полей ввода зависит, получается. Я этот момент пропустил.
Пожалуй, такой use-case ещё куда ни шло. Но тут проще по IP блок поставить на мой взгляд. Разница в том, что в варианте PoW можно всё сделать на клиенте.
Tangeman
30.09.2021 00:33Пауза на клиенте с идеей PoW гораздо проще, мне кажется.
Пауза — это открытое соединение, ценный ресурс. Гораздо проще по достижении лимита вплоть до исчерпания времени паузы все запросы отбивать с кодами 429 или 503 и установкой заголовка Retry-After для индикации оставшегося времени ожидания, а особо упорных (которые продолжают слать запросы до его истечения) — банить жёстко.
Хотя, честно говоря, все эти ожидания и прочие лимиты, включая PoW мало помогают против "продвинутых" ломателей — ко мне приходили целые полчища ботов, притворялись полноценными клиентами (js, все дела) — в логах это видно как один-два запроса в секунду на логин, с одного IP пробуют ровно одну пару, максимум две — и он не пытается больше в ближайшие сутки. Да, скорость перебора так себе, но оно ж кушать не просит и не торопится, а банить — по какому критерию? Настоящие пользователи тоже ошибаются, в час обычно парочка пробует с пяток имен-паролей к своим аккаунтам — потому что забывают либо пароли либо как именно зарегистрированы.
amg0461 Автор
30.09.2021 11:08Пауза — это открытое соединение, ценный ресурс.
PoW на клиенте производится до отправки запроса на сервер, никакого открытого соединения. По поводу того, что против лома нет приема — так оно, с этим никто не спорит.
alex_shpak
28.09.2021 23:13+4Интересная идея!
Я в своё время по примеру этой статьи сделал поле
<input name="email">
и скрыл его через CSS. Человеческие посетители оставляли его пустым, а боты заполняли.SergeiMinaev
29.09.2021 03:04+3Подобные решения, хоть и легко обходятся при желании, но зато хорошо защищают автоматизированных ботов. Я на своём сайтике делал капчу из двух галок - для её прохождения нужно было поставить только одну (там прям написано было, какую ставить). Боты ставили или обе или ни одной. После этого кол-во спамных комментариев от ботов сократилось почти до нуля.
DKursk
29.09.2021 10:52+1Помимо ботов это может сделать автозаполнение форм. В приведенной статье используется поле с другим названием.
Goodwinnew
29.09.2021 10:57+1уже не работает в 50% случаев
бот анализирует (что увидит пользователь) и не заполняет скрытые поля
ps
50% - из моих логов видно статистику
pingo
28.09.2021 23:17+2у меня до сих пор работает <input name=url /> скрытый в css от хуманов, лог ботов уже километровый за 7 лет. как перестанет работать, воткну капчу
amg0461 Автор
28.09.2021 23:52+2Ну моя идея решает задачу не столько защиты от ботов (скрытое поле это классическое решение), сколько защиты от хакера и брутфорса.
ifap
29.09.2021 00:33Видимо, Ваш сайт просто не интересен ботам ;) У меня на форуме капча — вопрос на знание поговорок, ответ вообще нигде не подсказан, но раз в ~полгода приходится вопросы менять, т.к. спамеры заходят, вручную вбивают ответ в свою базу, и снова здарова!
Goodwinnew
29.09.2021 10:47можно вопрос картинкой сделать :)
конечно - человек и вопрос прочитает и ответ правильный сделает.
а как бот вопрос прочитает? да, OCR есть. как именно бот узнает, в какой картинке вопрос?
прогонять все картинки через OCR.....замучается пыль глотать ©
надо целый модуль спамерам уже писать - что вот в этой картинке вопрос, его надо через OCR прогнать и вытащить этому вопросу правильный ответ из своей базы
ps
все-таки надо разделять спамеров и взломщиков. спамеры в основном по площадям работают и иногда дописывают своего бота, что бы % размещения был выше.
а взлом - другое дело. тут уже целевая атака на конкретную защиту.
pss
и да - у меня ответ на вопрос 1го января ежегодно сам меняется :)
amg0461 Автор
29.09.2021 10:52Проблема все же не столько в ботах (от них защититься более или менее понятно как), а в живых людях, которые поставили себе задачу сломать вашу капчу. Написать программу, распознающую вашу картинку, под силам даже школьнику (ну ладно, первокурснику). А уж один и тот же ответ на вопрос в течение года вообще от хакера никак не защищает. Ну вы и сами это понимаете.
Goodwinnew
29.09.2021 11:10:)
там мы же с не хакерами боремся. а с тупыми программерами, которые создают тупых ботов.
мой рекорд - 500 писем в час (через форму) на тему открытия торгового центра в Пекине (Китай), текст на иероглифах (перевел через гугль), email случайно сгенерирован, IP каждый раз разный.
там реальный был только адрес и телефон в Китае. кто-то запустил рекламную компанию с таргетингом по всем миру и без анализа, куда он её уже отправил. и пошел пиво пить.
пришлось ваять защиту на коленке.
и защиту от наличия иероглифов в тесте сообщения добавил, сообщение в форме на иероглифах теперь в принципе не отправляется
amg0461 Автор
29.09.2021 11:13там мы же с не хакерами боремся. а с тупыми программерами, которые создают тупых ботов.
Как раз моя статья посвящена борьбе именно с хакерами, а не с ботами.
ifap
29.09.2021 14:08В данном случае если вопрос картинкой, то спамеры не будут мутить OCR, они просто будут считывать первые N байтов файла с картинкой, идентифицируя вопрос таким образом ;)
pil0t
28.09.2021 22:49+2Идея интересная, но в текущем виде защита только от script kiddies
Основная проблема - разница в производительности недорогого смартфона 3-4 летней давности и современных ASIC
майнеров"числодробилок", тут либо на смартфоне будет задержка в несколько минут и несколько процентов батареи, либо защита очень слабая.amg0461 Автор
28.09.2021 22:54Можно, например, в цикле while в моем скрипте опрашивать время, прошедшее с начала его выполнения, и при превышении времени более 5 с, например, выдавать традиционную капчу. Ну и понятно, что подбор количества бит, совпадения которых мы требуем в итоговом хеше, будет меняться со временем, ориентируясь на средние по производительности клиентские девайсы. Но я согласен с вами, предложена лишь идея, которую можно дорабатывать.
Layan
29.09.2021 16:39+1Можно в зависимости от устройства (User-Agent) делать разную сложность. Только в таком случае лучше это в WASM засунуть — тогда большинство «хакеров» не смогут вычислить точный алгоритм.
Но это security through obscurity.
Mox
29.09.2021 00:50+1Я так и не понял как это защищает от ботов.
Я завожу Selenium, через селекторы заполняю поля, нажимаю "отправить". Что не сработает то?amg0461 Автор
29.09.2021 10:13Хоть Selenium, хоть другие средства автоматизации — предложенное решение резко снижает количество попыток брутфорса или авторегистраций в секунду. Полной защиты от ботов это не дает, конечно (впрочем, как и капча, которая сегодня взламывается за сопоставимое время).
SergeiMinaev
29.09.2021 03:11+1Идея-то интересная, но если уж всё равно надо ждать N секунд, то проще банально сделать sleep(N) на сервере :)
amg0461 Автор
29.09.2021 10:15Не всегда это удобно, особенно в асинхронных средах типа nodejs. На клиентской стороне проще.
Goodwinnew
29.09.2021 10:52+1sleep не получится - так как бот умеет динамически IP менять, пока один IP будет ждать, с другого зайдут.
тут именно задержка на клиентской машине от ввода данных до возможности их отправить. - придется ждать в любом случае.
а если еще кнопку "отправить" рисовать JS через 1 сек = то 90% ботов вообще выпадет, они тупо через парсинг html работают, без запуска JS и кнопку они вообще не увидят
amg0461 Автор
29.09.2021 10:58Так можно вообще всю форму отправки сообщения нарисовать с помощью createElement(). Но не в ботах основная проблема.
cepera_ang
29.09.2021 05:15История сделала полный оборот и вы вдохновленный видимо криптовалютами придумали Hashcash, который в свою очередь вдохновил создателя биткоина :)
lavrok
29.09.2021 10:17+2Могу дополнить, что данный механизм можно усовершенствовать, повысив производительность вычислений для "нормального" клиента делая их внутри WASM. Скорость вычислений будет в разы выше, а значит можно поднять сложность алгоритма и добавив тем самым сложности недобросовестным переборщикам.
Также хорошей практикой будет вынести вычисления в отдельный воркер, что бы не блокировать основной поток.
zkrvndm
29.09.2021 10:17+1Согласно моему опыту, лучшая капча - это отслеживание браузерных событий. Запись событий должна соответствовать определенному паттерну: прокрутка вниз, движения мыши, клики по полям ввода.
pfffffffffffff
29.09.2021 10:38Мне кажется или капча лучше отсеивает ботов чем ваше решение
amg0461 Автор
29.09.2021 10:43Трудно сказать. Смотря какая капча (насколько она поддается взлому с помощью ИИ), смотря какая реализация моего решения (алгоритмы PoW могут быть очень и очень разными). Масштабного сравнительного тестирования же никто не делал.
gameplayer55055
30.09.2021 11:44С такой инновацией я со своего старого бука никуда не зайду. Или зайду, но полчаса будет хеш считать :)
tempick
Добавьте шорт-кат, пожалуйста
amg0461 Автор
Что-то новый редактор у меня не распознал markdown :) Сейчас попробую.
amg0461 Автор
del