Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.05.2014, 05:42
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

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

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

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

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

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

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

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

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

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

Последний раз редактировалось dmitry111, 26.05.2014 в 15:51.
Ответить с цитированием
  #2 (permalink)  
Старый 26.05.2014, 17:50
Аватар для deivan
Профессор
Отправить личное сообщение для deivan Посмотреть профиль Найти все сообщения от deivan
 
Регистрация: 02.08.2012
Сообщений: 293

может, требовать от сообщения обязательного присутствия некоторого ключа, связанного с пользователем?..
создать объект типа { secret: "xxxxxxx", message: " ... "}, сериализовать его в жсон и отправлять.
а на сервере придумать логику, которая будет требовать обязательного наличия поля secret ну и как-то его парсить, чтобы отсечь заведомо левые попытки..
Ответить с цитированием
  #3 (permalink)  
Старый 26.05.2014, 19:27
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Сообщение от dmitry111 Посмотреть сообщение
Вешать дополнительные проверки для отсеивания левых запросов не вариант,
Единственный вариант же. Любые входные данные надо проверять. На клиенте безопасности нет и быть не может.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 26.05.2014, 19:49
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

deivan,

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

Я хочу дать запрет на стадии рукопожатий, то есть вообще не открывать ws!
Ответить с цитированием
  #5 (permalink)  
Старый 26.05.2014, 19:59
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

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

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

1 накладно!

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

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


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

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

Последний раз редактировалось dmitry111, 26.05.2014 в 20:16.
Ответить с цитированием
  #6 (permalink)  
Старый 26.05.2014, 20:35
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

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

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

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

Последний раз редактировалось dmitry111, 26.05.2014 в 20:40.
Ответить с цитированием
  #7 (permalink)  
Старый 26.05.2014, 23:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Да никак же. И origin - тоже вовсе не проблема. У себя на компьютере злоумышленник может как хочет и что хочет подменить.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 03.06.2014, 00:15
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

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

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

Существенна ли задержка, если разбить сообщение на 5 частей и отправить из по отдельности?
Ответить с цитированием
  #9 (permalink)  
Старый 03.06.2014, 00:55
Профессор
Отправить личное сообщение для l-liava-l Посмотреть профиль Найти все сообщения от l-liava-l
 
Регистрация: 14.03.2012
Сообщений: 1,808

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

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

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

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

Поэксперементируй)
__________________
Научу себя плохому

Последний раз редактировалось l-liava-l, 03.06.2014 в 01:08.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
innerHTML и безопасность sommer Events/DOM/Window 25 24.10.2011 10:39
Ajax и безопасность Bezlepkin AJAX и COMET 1 14.07.2011 17:31
Javascript и компьютерная безопасность magicgate Общие вопросы Javascript 0 25.04.2011 00:44
Youtube подрывает безопасность России x-yuri Оффтопик 1 28.07.2010 12:02
Безопасность в jquery demi jQuery 6 10.03.2009 14:44