Почему сервер в запросе websocket должен ответить на вызов?

Я читаю спецификацию websocket, и он говорит:

Наконец, сервер должен доказать клиенту, что он получил клиента WebSocket, чтобы сервер не принимал соединения, которые не являются соединениями WebSocket. Это предотвращает злоумышленнику из-за обмана сервера WebSocket, созданных пакетов с использованием | XMLHttpRequest | или форму | представление.

Я читал его несколько раз, но мне все еще не ясно, почему это необходимо.

Ответ 1

Механизм вызова-ответа заставляет сервер удостовериться, что клиент является законным клиентом WebSocket, а не script делает забавные вещи.

Задача отправляется в HTTP-заголовке "Sec-WebSocket-Key". Так как браузеры не уверены, что сценарии не могут устанавливать заголовки "Sec- *", это предотвращает открытие script соединения WebSocket через XMLHttpRequest.

Если серверу не пришлось отвечать на вызов, возможно, что некоторые ленивые серверы полностью игнорируют заголовки "Sec-WebSocket- *", оставляя клиентов незащищенными от скриптов-изгоев.

Это может быть также способ позволить клиенту проверить, что он разговаривает с сервером WebSocket, но я думаю, что это не основная причина, так как сервер все равно должен отправлять код статуса 101 Switching Protocols вместе с заголовок "Upgrade: websocket".

Ответ 2

То, что я думаю, что это пытается предотвратить, - это две вещи.

  • Повторно атакуйте, когда человек в середине захватывает пакеты и пытается отправить их на сервер, поскольку сервер задаст другой вызов и, таким образом, отклонит соединение.

  • Http post и xmlhttp запрашивают отправку данных таким образом, что он запускает веб-сокет. Тот факт, что эти два метода не могут ответить, означает, что вызов не отвечает и сокет отклоняется сервером.

Ответ 4

Я бы предположил, что одна из основных причин - предотвратить атаки на серверы, если веб-сайт script был встроен в популярный веб-сайт, например. Вы можете превратить всю свою базу пользователей в нежелательную бот-сеть.

Это, конечно, не мешает злоумышленнику делать это на открытом сервере websocket, по крайней мере, я не думаю, но он остановил бы атаки на серверах без веб-сервера.