Безопасность в вебсокетах
Что проверять перед тем, как разрешать соединение ws?
Я проверяю origin. И если он совпадает, то разрешаю соединение. Это позволяет защитить сервер от подключений со сторонних ресурсов. Но, в браузерной консоли origin тоже совпадает, соответственно можно установить соединение через консоль и послать какой-то запрос, который завалит сервер! То есть, злоумышленник подключается к ресурсу, открывает консоль, пишет там например: var x = new WebSocket('ws://site.ru:3000/'); x.send(/*тут какое-то сообщение*/) и сервер падает) Как быть в таком случае? Вешать дополнительные проверки для отсеивания левых запросов не вариант, нужно беспрепятственное поступление данных! Нужно как-то решить это на уровне рукопожатия (handshake) Сам сервер опен сорсный, поэтому защита должна быть логической (без хитростей :)) В качестве вебсокетов использую ws |
может, требовать от сообщения обязательного присутствия некоторого ключа, связанного с пользователем?..
создать объект типа { secret: "xxxxxxx", message: " ... "}, сериализовать его в жсон и отправлять. а на сервере придумать логику, которая будет требовать обязательного наличия поля secret ну и как-то его парсить, чтобы отсечь заведомо левые попытки.. |
Цитата:
|
deivan,
А как секрет может помочь? Все данные (в том числе и секрет) доступны злоумышленнику! Я хочу дать запрет на стадии рукопожатий, то есть вообще не открывать ws! |
Цитата:
но проверять каждое сообщение это: 1 накладно! например игровой сервер на 30 пользователей будет получать где-то 90 соообщений в секунду! Если каждое это сообщение фильтровать - это затратно! 2 большая вероятность пропустить что-то. Ну и по мере развития приложения нужно всегда заботится об этих фильтрах. То есть появился новый слушатель у ws, нужно сперва организовать ему проверку, а потом уже обработку поступивших данных Вот поэтому я и хотел бы отсеивать левых юзеров на стадии рукопожатия! А уже для "чистых" пользователей открывать соединение без каких либо дополнительных проверок ЗЫ Тем более если сервер опенсорсный, то завалить его уж точно не проблема! |
чтобы понять о чем я, можно самим завалить сервер:
для начала, скачать и установить: git clone [url]https://gist.github.com/18f598a8576bd5f6ed84.git[/url] ws && cd ws && npm i ps уберите [ url ] [/ url] - они не нужны)) затем запустить: node server.js затем перейти на http://localhost:3000 Далее открыть браузерную консоль, и: создать соединение: var x = new WebSocket('ws://localhost:3000/') слушать событие: x.onmessage = function (e) {console.log(e.data)} // отправить 0 на сервер: x.send(0) // вернет 'Hello' // отправить 1 на сервер: x.send(1) // вернет 'World' // отправить 2 на сервер: // сервер не нашел нужную функцию и упал )) Я это к чему? Если ограничивать юзеров на пороге входа, то не нужно будет отлавливать их по всему серверу! В реальных приложениях x.send(0) и x.send(1) - отправляет программа, поэтому нет смысла ставить фильтры на каждое новое входящее сообщение! Отлавливать нарушителей можно проверяя origin! Но как отловить их когда origin совпадает? |
Да никак же. И origin - тоже вовсе не проблема. У себя на компьютере злоумышленник может как хочет и что хочет подменить.
|
Вот такой еще вопрос по вебсокетам:
Есть ли разница: отправить одно большое сообщение, или отправить несколько маленьких в сумме равных одному большому? Существенна ли задержка, если разбить сообщение на 5 частей и отправить из по отдельности? |
Цитата:
Отправляешь много мелких = нагрузка на сервер, а отпрвляешь 1 большой дольше сервак принимать будет а соотвественно и обрабатывать) И так не только в вебсокетах, просто логично) Поэксперементируй) |
Часовой пояс GMT +3, время: 21:02. |