LINUX.ORG.RU

Хочу сделать регистрацию без email, посоветуйте вычислительную задачку для браузера

 


3

1

Возникла идея сделать один мелкий сайтик с юзерами, а там регистрация. В силу того, что я не понял, зачем мне для регистрации просить email, да ещё гонять трафик и снюхиваться со всякими email-серверами, то емейла/телефона при регистрации не будет.

Но минимально защититься от спама хочется. Самодельный генератор капчи есть, написанный на крестах, который генерит капчу за 1..2 мсек, но всё же простейший ДДОС с кучей запросов на эту капчу быстро ушатает генератор и исчерпает запасы качп в базе, а завязываться на доступность гугловых рекапч не хочется, да и лишние коннекты ваять, когда генератор уже есть. Неважно насколько он крутой, важно что нейросеть у атакующего тяжелее этого генератора.

Поэтому возникла идея поставить капчу позже, а сначала попросить юзера доказать, что он выдержал некий proof-of-time алгоритм (и возможно proof-of-memory с микрокодом типа как в RandomX, но похрен). Proof-of-time - это, короче, пруф того, что ты регался не менее 5 секунд. Реализуется как 5 обменов с браузерным JS, между которыми не может быть менее секунды, причём сервер не утруждает себя хранением состояния, чтобы выдерживать SYN-flood-атаки (запустили регистрацию 100500 раз и свалили).

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

На экране юзера такая регистрация будет выглядеть как прогресс-бар, который тупо доходит до 100% за 5 секунд.

Простейший вариант - тупо зашифровать своим секретным ключом AES128 строчку вида <256-bit-random-salt> и на входе расшифровывать обратно, сверяя timestamp. Но может есть чё попроще или наоборот поумнее, понадёжнее или «так же надёжно, но вычислительно сильно дешевле»?

А ещё были такие идеи на тему proof-of-memory: генерим на сервере 512 байт данных и запоминаем, а юзеру отправляем 1 МБ, где в случайных местах замешаны эти 512 байт. Потом посылаем юзеру 10 запросов в рандомные места этого 1 МБ куска, ответы на большинство из которых нас не волнуют. Пара запросов, которые попадают в «наши данные» мы проверяем, но юзер вынужден помнить весь 1 МБ, не зная где среди них лежат наши данные. Потом я прочитал про RandomX и понял, что это содомия, а нормальные чуваки просто генерят какой-то псевдомашинный код на тему перемещения блоков в памяти, который (код) юзер физически состоянии исполнить только имея, скажем, 4 гига оперативы - короче надо ещё про это почитать! Жаба конечно задушит каждому дебилу по 1 МБ рассылать. Нужно, чтобы псевдокод для исполнения у жертвы не мог вернуть верный результат без использования настоящих 16 мегабайт памяти, но чтобы результат работы кода был мизерным и был известен серверу прямо в момент генерации этого рандомного дьявольского псевдокода.



Последнее исправление: igloev (всего исправлений: 4)

Ответ на: комментарий от Morin

очень дружелюбный ресурс :)

Злой русский ресурс как все люди в России. Всё гармонично, зато чотко. Какой ресурс ещё даёт возможность задать 10 резервных паролей?

igloev
() автор топика
Ответ на: комментарий от anonymous

Тебе нужно строить хэширование пользователей на основе фингерпринтинга браузера

Два одинаковых новых макбука с одинаковыми браузерами из магазина и ты проиграл.

igloev
() автор топика
Ответ на: комментарий от anonymous

Тебе нужно строить хэширование пользователей на основе фингерпринтинга браузера

ну и да: напишут быстро плагин, который шлёт мне нули или рандомчик в эти фингерпринт-поля

igloev
() автор топика
Ответ на: комментарий от torvn77

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

simbol_a=477554
...
simbol_Z=4798955
...
simbol_9=37896785

И при нажатии на соответствующую кнопку в переменную с именем будет добавляться не символ буквы, а её код.

Ну и тебе на сервер уходит строка вида 39860967;34567478;9876437;5765869
Это у тебя решит сразу несколько проблем:

  1. борьба с использованием букв из разных языков, но со схожим написанием для создания визуально совпадающих имён.
  2. под твой сайт надо будет писать отдельного робота.
  3. имя нельзя вставить копипастой,а значит его ввод с помощью мыши займёт некое минимальное время. (но скопировать в шпаргалку можно!)
torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от torvn77

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

Что мешает боту делать то-же самое? Определить каждую отдельную кнопку этой клавиатуры и распознать букву вообще элементарно. Также симулировать движение мыши как будто человек двигает с нужными интервалами так-же делается легко.

Я вот для одной игры с ущербным инвентарем написал бота который перебирает все элементы инвентаря(просто эмулируем нажатия кнопок), распознает текст и пиктограммы(OpenCV, даже алгоритм писать не пришлось готовый гуглится за 5 минут), распознается весь текст(Tesseract OCR) и затем все это показывает в удобной таблице. А ведь в отличии от экранной клавиатуры инвентарь в игре висит в 3D пространстве с перспективным искажением да еще и полупрозрачный, так что распознать экранную клавиатуру это вообще простейшее дело.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Определить каждую отдельную кнопку этой клавиатуры и распознать букву вообще элементарно.

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

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


Или вот ещё вариант, названия и коды кнопок неизменны, но реальное соответствие кнопки экранному символу кодируется тем, какое изображение записывается в файл с внешним видом буквы, таким образом одна и таже строка при отправке на сервер будет всякий раз иметь новое случайное значение.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 4)
Ответ на: комментарий от torvn77

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

Так не надо лезть в код или в переменные, и подмешивание не поможет. В том боте что я для игры писал там разные размеры букв с разным цветом и фоном(из-за того что фон полупрозрачный то шум на фоне почти всегда разный), и все это Tesseract OCR распознает без какой-либо фильтрации а ведь можно еще фильтры всякие сделать. Все что надо это сделать снимок экрана и использовать opencv + tesseract, то как код написан вообще не важно хоть каждый раз разные реализации.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

И сколько спамеров это осилят или просто сделают ради какого-то малопопулярного форума?

И ведь не забывай, надо ведь ещё и курсор мыши наводить и эмитировать нажатие.

torvn77 ★★★★★
()
Ответ на: комментарий от V1KT0P

из-за того что фон полупрозрачный

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

torvn77 ★★★★★
()
Ответ на: комментарий от torvn77

И сколько спамеров это осилят или просто сделают ради какого-то малопопулярного форума?

Столько-же сколько и для других подобных каптч.

И ведь не забывай, надо ведь ещё и курсор мыши наводить и эмитировать нажатие.

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

V1KT0P ★★
()
Ответ на: комментарий от torvn77

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

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

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Я лет 20 назад с помощью FineReader распохнавал текст с со сканов книжки, так вот, мой опыт показывает что коректное распознавание текста на сканированной бумаге начинается 300 dpi, то есть простое снижение dpi уже может сделать невозможным безъошибочное распознавание.
Может тебе с этим поэсперементировать?

Сделай 120 и для каждой следующей буквы бери новый шрифт и слегка меняй размер.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 3)
Ответ на: комментарий от torvn77

Может тебе с этим поэсперементировать?

Было бы интересно попробовать, но сейчас жалко на это время тратить. Я как-то писал под заказ бота для обхода капчи где цифры были с искажением и генерированным мусором перед и за цифрами, распознавало правильно где-то в 40%-60% случаях что полностью устраивало. Написать такой для лимитированного количества символов не так сложно, не важно как искажаются всегда можно посчитать процент вероятности каждого символа на соответствии с каждым символом из конечного набора. Затем просто в обратную сторону для каждого символа выбрать вариант с наибольшим процентом совпадения, так как нам известно что для каждого символа есть только одно изображение(можно конечно дублировать символы на экранной клавиатуре, но это не особо усложнит алгоритм).

V1KT0P ★★
()
Ответ на: комментарий от bvn13

помести сервер за CloudFlare - делов-то

Зачем мне любое действие пользователя за 200 мсек, когда можно за 10.

igloev
() автор топика
Ответ на: комментарий от igloev

Если у тебя в проверке «юзерности» не участвует юзер своими человеческими действиями, то это как раз то, о чем я говорю.

Aswed ★★★★★
()

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

grem ★★★★★
()
Ответ на: комментарий от Aswed

Если у тебя в проверке «юзерности»

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

igloev
() автор топика
Ответ на: комментарий от grem

Почему просто не использовать привязку к существующим сервисам

Зависеть от внешних субподрядчиков на ровном месте - ну такое.

igloev
() автор топика

Отсылай код подтверждения регистрации по почте до востребования.

anonymous
()
Ответ на: комментарий от anonymous

Отсылай код подтверждения регистрации по почте до востребования.

Конный гонец с донесением у нас на вип-тарифах.

igloev
() автор топика

не надо ничего.

юзер генерит уникальный логин и AES, отправляет на сервер. регистрация завершена.

при входе вводим логин. по логину сервер выбирает ключ, которым шифрует все, что отдает клиенту. а дальше клиент либо может это расшифровать (если он помнит свой ключик) либо нет.

как предотвратить DDOS и спам это совсем другие вопросы.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

юзер генерит уникальный логин и AES, отправляет на сервер.

База порвётся в первый час спама такой хренью в 100500 потоков.

igloev
() автор топика
Ответ на: комментарий от igloev

т.е. база не сможет выполнить 100500 тупых инсертов? окей, но тогда с инсертами (и валидацией) емейлов при регистрации у нас еще больше проблем.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

т.е. база не сможет выполнить 100500 тупых инсертов?

Может, но зачем.

окей, но тогда с инсертами (и валидацией) емейлов

У нас нет емейлов, написано же.

igloev
() автор топика
Ответ на: комментарий от igloev

Может, но зачем.

ты мне скажи, это же твой сценарий.

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

стандартный подход - цифровая идентификация посетителя и запрет повторных действия для данного айди в течение … минут … часов… дней. нафейхоа одному юзеру регистрироваться каждый день по 5 раз в день?

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

если тебе хочется защититься от спам-регистрации методом создания недешевой нагрузки на клиенте - пусть коротенький RSA брутфорсит. забрутфорсил - расшифровал сообщение - отправил на сервак - сервер провел сравнение - велкам.

но лучше пусть биткойн майнит )

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

ты мне скажи, это же твой сценарий.

Про засылку чего-то в базу ты написал, так что не мой это сценарий.

igloev
() автор топика
Ответ на: комментарий от igloev

То, что ты пропустил или не понял вторую часть сообщения, многое о теье говорит.

Успехов.

anonymous
()
Ответ на: комментарий от anonymous

То, что ты пропустил или не понял вторую часть сообщения, многое о теье говорит

Ты описал гуглокапчу «I am not a robot», так что я не стал вступать в срачь по факту твоего технологического боянизма.

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

igloev
() автор топика
Ответ на: комментарий от olelookoe

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

Это не «Другой вопрос», а тема треда. Точнее «ограничение бот-регистраций», а про спам речи не шло.

igloev
() автор топика

Простейший вариант - тупо зашифровать своим секретным ключом AES128 строчку вида <256-bit-random-salt> и на входе расшифровывать обратно, сверяя timestamp. Но может есть чё попроще или наоборот поумнее, понадёжнее или «так же надёжно, но вычислительно сильно дешевле»?

Да, можно подешевле.
сервер посылает:

  • timestamp
  • N (номер секунды от 1 до 5)
  • client_no (порядковый номер GET-запроса твоей страницы login.html)
  • Hash(timestamp + N + client_no + KEY)

здесь плюсом обозначена конкатенация,
KEY = ключ сервера (случайное число, читаем его из /dev/random при запуске процесса сервера),
Hash = быстрая хэш-функция, которая не обязана быть совсем криптостойкой (т.е., можно взять стандартную криптографическую хеш-функцию и ослабить её, уменьшив кол-во внутренних циклов в несколько раз для ускорения вычислений)

Egor_
()
Ответ на: комментарий от Egor_

Спасибо. Да, действительно, можно упростить просто до нешифрованного пакета с чексуммой-с-ключом в конце…

igloev
() автор топика
Ответ на: комментарий от peregrine

Кормить говном пользователей не дав им возможность восстановления доступа? Да ты в тренде, может ещё и tox используешь?

grem ★★★★★
()
Ответ на: комментарий от igloev

Восстановление доступа к аккаунту ты как планируешь сделать? А пользователя ты спросил? Ему оно надо на каком-то местячковом ресурсе регистрироваться?

grem ★★★★★
()
Ответ на: комментарий от grem

Восстановление доступа к аккаунту ты как планируешь сделать?

Попрошу особо озабоченных сохранением контроля над аккаунтом задать в профиле суперсложный master-пароль и записать его в укромном месте, а так же ещё дополнительных 3 пароля попроще для логина.

Просто не сильно понятно, с чего вдруг все решили, что восстановление доступа должно быть именно через e-mail. А почему не через фейсбук, например?

igloev
() автор топика
Ответ на: комментарий от grem

Ему оно надо на каком-то местячковом ресурсе регистрироваться?

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

igloev
() автор топика
Ответ на: комментарий от igloev

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

grem ★★★★★
()
Ответ на: комментарий от grem

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

Пока вроде следую своему заявлению.

igloev
() автор топика

Что-то больше похоже на дерьмо. Уж лучше на почту отправлять ссылку для входа. Вышел – проси новую ссылку. Ни паролей ни чгео не нужно. Вот это оптимально.

kostyarin_ ★★
()

Лучше делегировать это дело какому-нибудь KYC-сервису. Ну чтобы точно конплюхтеры не регались.

kostyarin_ ★★
()
Ответ на: комментарий от Singularity

Алгоритм там описан, тебе осталось переписать на JS.

Не увидел там запрошенного в треде proof-of-time или -of-memory.

igloev
() автор топика
Ответ на: комментарий от kostyarin_

Что-то больше похоже на дерьмо. Уж лучше на почту отправлять ссылку для входа. Вышел – проси новую ссылку. Ни паролей ни чгео не нужно. Вот это оптимально.

Супердерьмо идея. Вместо «зайди на страницу» надо «зайди на страницу, проверь почту, зайди опять по ссылке». Усложнение жизни юзера в планы не входит.

igloev
() автор топика
Ответ на: комментарий от igloev

Супердерьмо идея. Вместо «зайди на страницу» надо «зайди на страницу, проверь почту, зайди опять по ссылке». Усложнение жизни юзера в планы не входит.

Хранишь сессию в вечных куках и всё. Если у пользователя есть пара логин+пароль, то пароль он скорее всего выберет какой-то простой, что с безопаснстью не вяжется. Или вообще не будет его запоминать – что вынуждает идти на почту.

А вот капча – это полная фигня. Типа человек тебе должен доказывать что он человек. Причём аудитором выступает тупая железка. Тебе случайно отражение садиста в зеркале не подмигивает?

kostyarin_ ★★
()

Делай матан капчу из Демидовича. И ботов и дебилов отсечёт разом. Профит.

anonymous
()

А просто разрешать регистрацию раз в десять секунд, не? if(currenttine - lastregistrationtime < 10) return error(«please wait some time»);

Сам же говоришь «маленький сайтик»…

invy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.