2011-06-16 11 views
10

estoy leyendo la especificación WebSocket y dice:¿Por qué el servidor en una solicitud de websocket tiene que responder a un desafío?

Por último, el servidor tiene que demostrar al cliente que recibió el apretón de manos del cliente WebSocket , por lo que el servidor no acepta conexiones que son no conexiones de WebSocket. Esto evita que un atacante engañe a un servidor WebSocket enviándolo con cuidado: paquetes elaborados utilizando | XMLHttpRequest | o una | forma | sumisión.

Lo he leído varias veces, pero todavía no está claro para mí por qué es necesario.

+0

Me gustaría escuchar una opinión sobre esto. No puedo encontrar ninguna razón –

Respuesta

9

El mecanismo de desafío-respuesta obliga al servidor a asegurarse de que el cliente sea un cliente legítimo de WebSocket, y no un script que haga cosas divertidas.

El desafío se envía en un encabezado HTTP "Sec-WebSocket-Key". Dado que los navegadores se aseguran de que los scripts no puedan establecer encabezados "Sec- *", esto evita que un script abra una conexión WebSocket a través de XMLHttpRequest.

Si el servidor no tuvo que responder al desafío, es posible que algunos servidores vagos ignoren por completo los encabezados "Sec-WebSocket- *", dejando a los clientes desprotegidos de las secuencias de comandos fraudulentas.

También puede ser una forma de permitir que el cliente verifique que está hablando con un servidor WebSocket, pero creo que esa no es la razón principal, ya que el servidor debe enviar un código de estado de 101 protocolos de conmutación de todos modos. con un encabezado "Actualizar: websocket".

+0

Ah, no sabía acerca de la restricción "sec- *" en los encabezados XHR, pero aquí está en la especificación: http://www.w3.org/TR/XMLHttpRequest/ # the-setrequestheader-method – Deebster

0

Lo que creo que esto está tratando de evitar son dos cosas.

  1. ataques de repetición, donde un hombre en el medio captura los paquetes y trata de volver a enviarlos al servidor que el servidor le pedirá a un reto diferente y por lo tanto rechazar la conexión

  2. HTTP Post y peticiones XMLHTTP enviar datos de tal manera que inicie un socket web. El hecho de que estos dos métodos respuesta no puede decir que el desafío va sin contestar y la toma es rechazado por el servidor

+2

Estas serían respuestas válidas si el desafío era para el cliente, pero AFAICT el desafío es que el servidor responda. –

+0

ah, perdí esa parte: P – Lodle

0

Supongo que una de las principales razones es para evitar ataques a los servidores si un script websocket se incrustó en un sitio web popular, por ejemplo. Podrías convertir tu base de usuarios completa en una botnet reacia.

Esto, por supuesto, no evita que una persona malintencionada lo haga en un servidor abierto de websocket, al menos no lo creo, pero detendría los ataques en servidores que no sean de websocket.

Cuestiones relacionadas