2013-04-28 4 views
0

На сервере TCP/Linux для Linux/C++ мне нужно предотвратить появление вредоносного клиента несколькими сокетами, иначе они могут просто открыть тысячи подключений до тех пор, пока сервер не выйдет из строя.C++ - Обнаружение нескольких подключений к серверу

Каков стандартный способ проверки того, имеет ли тот же компьютер соединение на сервере? Если я сделаю это исходя из IP-адреса, это не означает, что два человека в одном доме не могут одновременно подключаться к серверу, даже если они находятся на разных компьютерах?

Любая информация поможет! Спасибо заранее.

ответ

1

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

1) Ограничьте количество подключений от любого IP-адреса до разумного числа, например 10 или 20 (в зависимости от того, что на самом деле делает ваша система). Таким образом, это предотвратит вредоносных DoS-атак, но при этом допускают разумное использование.

2) Ограничьте максимальное количество подключений к чему-то разумному.

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

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

+0

Спасибо за информацию. Я могу реализовать первый вариант. Я подожду немного, чтобы другие люди прокомментировали некоторые возможные решения :) –

1

Существует только IP-адрес базы «это тот же отправитель», если у вас нет какой-либо системы подписки/входа в систему (но тогда кто-то может попытаться войти в gazillion раз за раз, так как должен быть какой-то вид рукопожатия для входа в систему).

Если два клиента используют один и тот же маршрутизатор (который использует NAT или какую-либо аналогичную схему), ваш сервер увидит один и тот же IP-адрес, поэтому разрешение только одного соединения на IP-адрес не будет работать очень хорошо для «нескольких пользователей из тот же дом ». Это также применимо, если они, например, используются в университетской сети или в сети компаний.

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

Возможно, имеет смысл иметь какой-то «скользящий средний», поэтому вы принимаете X новых подключений за Y секунд от каждого IP-адреса, вместо того, чтобы иметь фиксированное максимальное число. Это имеет смысл, если соединения продолжаются довольно долго ... Для коротких соединений времени это довольно бессмысленно ...

Смежные вопросы