2013-05-15 1 views
4

Чтобы открыть веб-узел, клиент подключается к сокету tcp на сервере, а затем начинает квитирование.Почему WebSockets использует хэш в рукопожатии?

Клиентское рукопожатие клиента содержит ключ с кодировкой base64 (Sec-WebScoket-Key).

Сервер должен отвечать SHA-1 (ключ + magic_constant), закодированный base64. magic_constant - это строка, специфичная для протокола (Sec-Websocket-Accept).

Какова цель этого? Я не вижу никаких очевидных соображений безопасности для этого. он не аутентифицирует ни одну из сторон. одно вычисление SHA-1 мало для доказательства работы.

ответ

3

Цель этой части рукопожатия - убедиться, что обе стороны соединения являются подлинными участниками WebSocket. Он предназначен для простого внедрения для реальных клиентов и серверов WebSocket, но для злоумышленника сложно обмануть HTTP-клиент, сервер или прокси, претендуя на роль участника WebSocket. В частности, было бы плохо, если бы фрагмент вредоносного JavaScript, работающий в браузере, мог открыть соединение с WebSocket с обычным HTTP-сервером, потому что, как только соединение будет установлено, JavaScript будет иметь полный контроль над тем, что отправлено по каналу, и может попробовать всевозможные искажения над негабаритными данными, чтобы попытаться нарушить или удалить сервер.

Update:

Как @notallama указывает, что легко создать вредоносный клиент WebSocket или просто использовать Telnet для отправки вредоносных данных. Разница в том, что с помощью WebSockets атака происходит из доверенного контекста (браузера пользователя и сети пользователя). Браузеры загружают ненадежный код из Интернета, но часто используются для подключения к HTTP-серверу и посредникам, которые не имеют доступа к Интернету в целом. В качестве крайнего примера предположим, что вместо WebSockets браузеры могут открывать необработанные TCP-соединения (без принудительной проверки CORS, хэш-чек и т. Д.). Теперь вредоносная часть JavaScript может делать все, что угодно, в домашней сети пользователей (или, что еще хуже, в их внутренней сети).

В частности, рабочая группа HyBi потратила чрезмерное количество времени на теоретическую уязвимость в HTTP-посредниках, которая позволила бы избежать загрязнения кэша с помощью соединения WebSocket, чтобы обмануть посредника, чтобы думать, что они разговаривают с обычным HTTP-клиентом.

+0

не мог злоумышленник так же легко подключиться к HTTP-серверу с помощью telnet и отправить ему плохие данные? я действительно не вижу, как это рукопожатие останавливает проблему или даже делает ее значительно сложнее. – notallama