LINUX.ORG.RU

Изобрёл алгоритм защиты от флуда. Покритикуйте.

 


1

2

Велосипед скорее всего.

Алгоритм повышения стоимости операций для клиента с сохранением низкой стоимости для сервера.

Пример где это нужно: хочется зарегать учётную запись без sms, email и т.п., но надо избежать флуда регистраций.

  1. В начале процедуры регистрации генерим на сервере 64КБ рандома.
  2. Запоминаем 8 случайных кусков по 8 байт из этих 64кб рандома и смещения до них.
  3. Отправляем юзеру данные 64кб и забываем эти 64 кб.
  4. Далее с интервалом в секунду посылаем юзеру запросы «дай 8 байт со смещения N», где очередное N - какое-то из запомненных нами на шаге (2).
  5. Юзер не знает что мы запомнили на шаге (2) и, таким образом, что сервер может спросить и вынужден хранить всё.
  6. Серверу нужно хранить только 8*8 байт.
  7. «с интервалом в секунду» - чтобы инициатива о длительности процедуры была полностью в руках сервера. Если клиент ответил раньше - отпинываем его совсем.

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

Хочется узнать:

  1. Как называется велосипед, который я только что изобрёл, у нормальных людей.
  2. Что можно улучшить.
  3. Альтернативы этому подходу.

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

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

i-rinat ★★★★★
()
Ответ на: комментарий от Harald

Ненастоящий рандом можно предсказать

предскажы :D

var iv = [Math.random(), Math.random(), Math.random()];
var a = 4;
var x = iv[0];
var xn = () => x = a * x * (1 - x);
var seq = Array(30).fill().map(xn);
var secret = [iv, seq[Math.trunc(iv[1] * seq.length)], seq[Math.trunc(iv[1] * seq.length)]]

console.log('lob:', seq);
console.log('q1', Math.trunc(iv[1] * seq.length));
console.log('q2', Math.trunc(iv[2] * seq.length));
drsm ★★
()
Последнее исправление: drsm (всего исправлений: 1)

Ты изобрел Proof-of-Storage (иногда Proof-of-Space), поищи. В блокчейнах несколько раз пытались в такое. Может что можно применить для задачи.

Proof-of-Work уже пытались применять против спама, сам Hashcash был собственно и предложен против спама еще в 1999, но оказался плохо применим по прямому назначению, так как спамеру легче иметь оборудование или ботнеты для атаки достаточной производительности, чтобы привести сложность для пользователя от некомфортной до непосильной.

Proof-of-Storage должен быть лучше, странно что при этом никто особо не пытался его так применять. Но проблема все равно остается: можно иметь ботнет с большим количеством места или арендовать на короткое время. В общем случае нужно учитывать, что у атакующего будет ресурса на порядки больше, чем у пользователя.

anonymous
()

В начале процедуры регистрации генерим на сервере 64КБ рандома.

А что не 64 гигабайта? А то сейчас у каждого по 32 гигабайта памяти в компьютере, это 500000 параллельных регистраций!

hateyoufeel ★★★★★
()

Раз ты так ненавидишь своих пользователей, используй блокчейн! Нужно чтобы пользователи майнили токены ради регистрации. Кто успешно смайнит новый блок, получает аккаунт. Сложность только сразу выставь по максимуму.

hateyoufeel ★★★★★
()

Давай с простого начнём. Кто в твоём случае «пользователь»? Конкретное ip соединение? ip адрес? Браузер с кукой? Как ты будешь идентифицировать состояние?

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

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

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

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

Давай с простого начнём. Кто в твоём случае «пользователь»? Конкретное ip соединение? ip адрес? Браузер с кукой? Как ты будешь идентифицировать состояние?

Не, надо со сложного. С простого уже я сам начал.

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

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

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

А на пользователей плевать, да?

На добросовестных пользователей с одним конекшеном не плевать и у них всё будет нормально. Та же капча — гораздо более иезуитское издевательство.

vodz ★★★★★
()

ночью посмотрю.

Deleted
()
Ответ на: комментарий от i-rinat

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

У меня нет сразу миллиона долларов на сервера, при чём тут плевать. Просто если мне виртуалка стоит в месяц 400 руб, а атакующему 4000 руб - я радуюсь. Пользователям не повезло одинаково в любом сценарии - я как был нищебродом так и остался.

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

Нет. Издевательство над юзерами, это номер мобильного телефона.

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

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

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

А чем больше плюсов, тем больше крипты автору поста от плюсанувших и сделать свою крипту, кто хочет, пусть генерит как проклятый?

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

jpeg у вас статический и будет в кеше. А 64К рандома нужно генерировать, т.е. выделить память, записать в память, отдать клиенту, отследить конец передачи и освободить. Это выйдет в ~10 раз дороже, т.е. у вас первые шаги дороже для сервера, и растет эта стоимость с обоих сторон одинаково и линейно.

На всякий уточню, что «~10 раз» имелось в виду в нагруженном сценарии, с usermode TCP-стеком и полным off-load непосредственно через DMA-ring.

Deleted
()
Ответ на: комментарий от i-rinat

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

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

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)

Покритикуйте

Говно.

anonymous
()

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

Что мешает эти 64КБ или больше хранить на SSD/HDD?

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

Каптча

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

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

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

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

Ты зря наехал на зелёных. Не в курсе что ли, что они с ботнетной мафией объеденились. Даже Анонимус на них не рыпается. Ведь они (мы) запросто могут задудосить твою мамку.

anonymous
()

Гораздо проще заставлять пользователей при регистрации покупать акции твоей крмпайки-сайта. Это решает все вопросы, кроме притока пользователей на начальном этапе. Эй-ки-эй МММ продуксион.

anonymous
()

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

Каменты почитал, и вот что я хочу спросить сказать. Если задача – не давать клиенту слишком часто пинать сервер, то проще держать массив таймстампов последнего пинка, индексы – TCP-порты соединений. Максимальное количество одновременных TCP-соединений – 64к (в реале обычно гораздо меньше); по 4 байта на таймстамп – с головой, скорее всего и в 2 байта можно уложиться (два ограничителя: точность допустим 0.1s; плюс давность: таймстампы часовой давности точно не нужны). Итого 128 килобайт (опять же, в реале обычно гораздо меньше) и никаких вычислений ни на сервере, ни на клиенте.

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

Максимальное количество одновременных TCP-соединений – 64к (в реале обычно гораздо меньше)

на самом деле больше

Harald ★★★★★
()

Почитал я тред и мне вот такая идея пришла в голову.

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

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

Всё уже придумано до нас?

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

Зачем майнить биткоин если его можно просто купить?

torvn77 ★★★★★
()

Чувак, ты не о том ресурсе подумал. Надо было не о CPU/RAM думать, а о времени. Просто не давать флудить юзеру, заставляя его ждать какое-то время, пусть 0.3 секунды, а если ты не хочешь чтобы регались боты миллионами, то разрешай не более 5 регистраций с подсети в час. Ну, и каптчу можно весёлую сделать, а не это унылое г от гугля. Например, стереть мышкой на канвасе красный круг, не трогая фиолетовый квадрат. Даже такая простая каптча отвернёт кучу ботов, 99%

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

Это каким же чудом? Номер порта в TCP-пакете 16-битный. Хм, разве что если слушать сразу несколько интерфейсов…

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

не надо юзать ip/подсеть как идентификатор

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

соединение идентифицируется не одним портом, а вектором (адрес источника, порт источника, адрес назначения, порт назначения)

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

Чувак, ты не о том ресурсе подумал. Надо было не о CPU/RAM думать, а о времени. Просто не давать флудить юзеру, заставляя его ждать какое-то время, пусть 0.3 секунды, а если ты не хочешь чтобы регались боты миллионами, то разрешай не более 5 регистраций с подсети в час. Ну, и каптчу можно весёлую сделать, а не это унылое г от гугля. Например, стереть мышкой на канвасе красный круг, не трогая фиолетовый квадрат. Даже такая простая каптча отвернёт кучу ботов, 99%

Спасибо, конструктивно.

«Не давать флудить» - это заложено в изначальное описание. Я ведь описывал некую систему шагов, которая заставляет юзерский JS обменяться с сервером какими-то 8 пакетами по 1 штуке в секунду. Для юзера это будет выглядеть как не очень долгий прогрессбар, а сервер будет отбивать попытки провести этот процесс быстрее.

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

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

Не нужно такое органичение.

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

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

Ты жопой читал. Речь не про «открывается», а про «регистрация». Регистрация всегда дольше 2 секунд на любом сцайте.

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

Пример где это нужно: хочется зарегать учётную запись без sms, email и т.п., но надо избежать флуда регистраций.

Может для тех кто только зарегистрировался просто ставить ограничения пока не докажут свою человечность?

Например новая тема от такого пользователя видна только админу и модераторам и помечается меткой и если кто из модеров подтвердит то тема становится видна и пользователь получает «очки человечности».

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

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

Для расчёта количества обслуживаемых портов, remote адреса-порты нерелевантны. А про локальный адрес я уже догадался.

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

Так-ссс. (Это был треск разрываемого шаблона.) Кажись дошло. Т.е. ты хочешь сказать, когда я делаю accept() на слушающий сокет, и мне возвращается fd, ядро диспатчит входящие пакеты на fd по всем четырём полям, поэтому одному локальному (хост, порт) может соответствовать несколько fd?

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

Перечитал твою ссылку ещё раз.

Inside the TCP stack, these four fields are used as a compound key to match up packets to connections (e.g. file descriptors).

Так что таки да. Ну да и пофиг – как и то что я 20 лет пребывал в заблуждении, и то что помру шибко умным. За инфу спасибо. :)

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

Спасибо. В целом у вас много разумных мыслей, были похожие.

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

Если сделать свою крипту, то весь ресурс превратится в площадку для пампа этой крипты.

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

Даже такая простая каптча отвернёт кучу ботов, 99%

Но ведь сложная капча для того делается, чтобы боты не научились её программно проходить?

vodz ★★★★★
()

Какой-то бред.

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

Ну и запустит он их не все параллельно, а поменьше, остальное будет происходить последовательно. Сильно легче что ли станет? Всё равно же можно тысячами регать ежесекундно, причём автоматизация уже лежит в основе.

Альтернативы этому подходу.

Капча, подтверждение по e-mail (и отшивать, если e-mail сервер левый, и с него идёт слишком много регистраций). Это, по крайней мере, действительно работает, в отличие от.

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

Речь о том, что задача подбора части хеша не приносит пользы человечеству

Я ничего не понял, при чем тут польза человечеству если я хочу просто пресечь флуд? Как будто какие-то другие алгоритмы и вычисления приносят пользу человечеству?

loz ★★★★★
()
11 февраля 2021 г.
Ответ на: комментарий от Harald

Можно генерировать в фоне и сохранять в какой-нибудь Redis для дальнейшего использования.

anonymous
()

Смысл в том, что если клиент захочет запустить много-много параллельных процессов

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

anonymous
()

С 10тью гигабайтами памяти можно одновременно долбить 156250 воркеров с регистрациями. На двух серверах *2. На амазоне на час снать ресурсов на 10 баксов. И вся система геристрации ляжет и миллионы ников пропишутся в базу данных откуда их уже не вынуть ибо хрен пойми реальный или бот. Конечно это отсейчёт локалхостников мамкиных )) Но не более того.

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

Я сейчас сгенерирую на основе Пи uuid и дам тебе, через сколько лет ты скажешь мне какой uuid будет следующим? )))))

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