Как вы предотвращаете отправку клиентом огромного пакета веб-сокетов?
Я делаю веб-приложение, которое использует WebSockets для связи между браузером и сервером узла.
Если вы откроете консоль отладки (F12), вы сможете получить доступ к экземпляру сокета и выполнить запись в него.
Например, socket.send('packetname', 'data')
Что мешает кому-то открыть консоль и написать что-то подобное?
socket.send(new Array(99999));
Все эти данные, отправляемые на сервер, могут быть чрезмерными, и к тому времени, когда они туда попадают, пропускная способность уже используется и уже обработана. Конечно, есть проверка, но в этот момент уже слишком поздно, и ресурсы уже потрачены на ее обработку.
Вы также не можете просто проверить длину массива, потому что кто-то может отправить массив, где первый элемент - это огромный массив, или что-то действительно. Я не думаю, что есть способ рассчитать размер в байтах, поэтому я думаю, что лучший вариант - это упорядочить данные, чтобы проверить их размер (что очень медленно)?
Все мои пакеты очень маленькие. Я ищу способ предотвращения отправки пакетов более определенного размера на сервер. Это возможно?
2 ответа
Если у вас нет полного контроля над клиентом (а у вас его нет), вы не сможете помешать клиенту отправлять произвольные большие данные в вашу систему. Клиенту даже не потребуется использовать браузер, поэтому любые ограничения внутри браузера не будут работать.
Вам просто нужно иметь дело с этим, например, с немедленным отключением клиента, если вы получаете неожиданный объем данных, и, возможно, занесение в черный список источника, чтобы следующая попытка атаки была остановлена раньше.
Вероятно, не существует "лучшего" решения для этого. Я бы просто подумал о том, что вы можете реализовать на стороне сервера, чтобы обнаружить, может ли что-то подобное происходить. Что касается остановки клиента на стороне клиента, это трудно или, возможно, невозможно сделать. Ваш сервер предназначен для приема соединений и данных, поэтому клиенты могут попытаться использовать это.
Одно из возможных решений, которое я могу предложить, - это "верхний предел" количества данных, которые клиент отправляет за одну операцию. Я не знаю характер вашего заявления, но, возможно, клиент отправляет 2500 bytes
данных в одной операции было бы совершенно невозможно, учитывая характер вашего приложения.
В этом случае, если операция (полученные байты) начинает превышать этот верхний предел, соединение может быть разорвано.
Это только одно потенциальное решение, которое я могу придумать, но вам нужно будет что-то придумать в этом направлении.