Verificar el dominio solicitante

0

Tengo un servidor http y websocket escrito en nodejs (por ahora) y recibirá solicitudes de muchos dominios diferentes. La solicitud se realiza desde el cliente utilizando JS.

Necesito verificar al 100% que la solicitud proviene de ese dominio de origen. Cuando reciba la solicitud, quiero verificar el dominio de terceros desde el que se originó, para garantizar que alguien no envíe solicitudes que simulen ser otro dominio.

Puedo dar una identidad a cada dominio, pero la solicitud se origina en el lado del cliente.

Estoy usando HTTPS en mi dominio.

Digamos que estoy ejecutando un servidor en A.com y permito que las personas descarguen mi SDK del lado del cliente JS y realicen solicitudes a mi servidor. Cuando recibo una solicitud de B.com, necesito asegurarme de que este es el lugar donde realmente se encuentra el cliente.

¿Es suficiente SSL / HTTPS? ¿Debo suponer que cuando mi servidor recibe una solicitud de un sitio habilitado para SSL, puedo confiar un 99.999% en la URL en el encabezado?

    
pregunta ydennis 30.10.2018 - 15:03
fuente

1 respuesta

1

No estoy completamente seguro de a qué te refieres con esto

  

Cuando reciba la solicitud, deseo verificar el dominio de terceros desde el cual se originó, para garantizar que alguien no envíe solicitudes que simulen ser otro dominio.

Por ejemplo, aquí está la solicitud HTTP que mi navegador hizo para cargar esta página:

GET /questions/196706/verify-the-requesting-domain HTTP/1.1
Host: security.stackexchange.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 
Firefox/64.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: ... snip ....
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

Nada allí indica de qué dominio proviene mi navegador web. Ni siquiera estoy seguro de saber lo que eso significa.

¿Quizás te refieres a que se accederá a tu API desde las páginas servidas desde otros dominios y quieres minar el encabezado Referrer: ?

Referer: https://my.domain.com/somepage

De cualquier manera, la arquitectura cliente-servidor de HTTP significa que aquí no hay seguridad; el cliente puede, literalmente, poner lo que quiera en la solicitud y el servidor no tiene forma de verificar si es "correcto". Ya sea que esté usando HTTP o HTTPS no hay diferencia aquí.

Considere el siguiente comando cURL que muestra que puedo crear una solicitud HTTP con cualquier texto de encabezado que desee, y luego enviarlo a cualquier servidor que desee:

curl -X GET -H "Accept: text/html" -H "Referer: https://my.domain.com/somepage" https://someHostName/someEndpoint

Solución: Autenticación mutua (también conocida como "autenticación del cliente") TLS

Parece que la solución que está buscando es TLS autenticadamente autenticado , que está diseñado precisamente para obligar al cliente a probar su identidad antes de que el servidor abra una conexión.

Esto implicaría emitir certificados a sus clientes (como lo hace con su servidor), y luego configurar su servidor para que solo acepte conexiones entrantes de certificados confiables.

    
respondido por el Mike Ounsworth 30.10.2018 - 16:01
fuente

Lea otras preguntas en las etiquetas