Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Безопасность в вебсокетах (https://javascript.ru/forum/offtopic/47479-bezopasnost-v-vebsoketakh.html)

dmitry111 26.05.2014 05:42

Безопасность в вебсокетах
 
Что проверять перед тем, как разрешать соединение ws?

Я проверяю origin. И если он совпадает, то разрешаю соединение. Это позволяет защитить сервер от подключений со сторонних ресурсов.

Но, в браузерной консоли origin тоже совпадает, соответственно можно установить соединение через консоль и послать какой-то запрос, который завалит сервер! То есть, злоумышленник подключается к ресурсу, открывает консоль, пишет там например:

var x = new WebSocket('ws://site.ru:3000/');
x.send(/*тут какое-то сообщение*/)

и сервер падает)

Как быть в таком случае?

Вешать дополнительные проверки для отсеивания левых запросов не вариант, нужно беспрепятственное поступление данных! Нужно как-то решить это на уровне рукопожатия (handshake)

Сам сервер опен сорсный, поэтому защита должна быть логической (без хитростей :))

В качестве вебсокетов использую ws

deivan 26.05.2014 17:50

может, требовать от сообщения обязательного присутствия некоторого ключа, связанного с пользователем?..
создать объект типа { secret: "xxxxxxx", message: " ... "}, сериализовать его в жсон и отправлять.
а на сервере придумать логику, которая будет требовать обязательного наличия поля secret ну и как-то его парсить, чтобы отсечь заведомо левые попытки..

Aetae 26.05.2014 19:27

Цитата:

Сообщение от dmitry111 (Сообщение 313437)
Вешать дополнительные проверки для отсеивания левых запросов не вариант,

Единственный вариант же. Любые входные данные надо проверять. На клиенте безопасности нет и быть не может.

dmitry111 26.05.2014 19:49

deivan,

А как секрет может помочь?
Все данные (в том числе и секрет) доступны злоумышленнику!

Я хочу дать запрет на стадии рукопожатий, то есть вообще не открывать ws!

dmitry111 26.05.2014 19:59

Цитата:

Сообщение от Aetae
Единственный вариант же. Любые входные данные надо проверять. На клиенте безопасности нет и быть не может.

по поводу клиента согласен!

но проверять каждое сообщение это:

1 накладно!

например игровой сервер на 30 пользователей будет получать где-то 90 соообщений в секунду! Если каждое это сообщение фильтровать - это затратно!

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


Вот поэтому я и хотел бы отсеивать левых юзеров на стадии рукопожатия! А уже для "чистых" пользователей открывать соединение без каких либо дополнительных проверок

ЗЫ Тем более если сервер опенсорсный, то завалить его уж точно не проблема!

dmitry111 26.05.2014 20:35

чтобы понять о чем я, можно самим завалить сервер:

для начала, скачать и установить:

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 совпадает?

Aetae 26.05.2014 23:24

Да никак же. И origin - тоже вовсе не проблема. У себя на компьютере злоумышленник может как хочет и что хочет подменить.

dmitry111 03.06.2014 00:15

Вот такой еще вопрос по вебсокетам:

Есть ли разница: отправить одно большое сообщение, или отправить несколько маленьких в сумме равных одному большому?

Существенна ли задержка, если разбить сообщение на 5 частей и отправить из по отдельности?

l-liava-l 03.06.2014 00:55

Цитата:

Вот такой еще вопрос по вебсокетам:

Есть ли разница: отправить одно большое сообщение, или отправить несколько маленьких в сумме равных одному большому?

Существенна ли задержка, если разбить сообщение на 5 частей и отправить из по отдельности?
А сервак их так же отдавать по частям будет?
Отправляешь много мелких = нагрузка на сервер, а отпрвляешь 1 большой дольше сервак принимать будет а соотвественно и обрабатывать)

И так не только в вебсокетах, просто логично)

Поэксперементируй)


Часовой пояс GMT +3, время: 21:02.