Verifica il dominio richiedente

0

Ho un server http e websocket scritto in nodejs (per ora) e riceverà richieste da molti domini diversi. La richiesta viene effettuata dal client utilizzando JS.

Devo verificare al 100% che la richiesta provenga da quel dominio di origine. Quando ricevo la richiesta, desidero verificare il dominio di terze parti da cui è originato, per garantire che qualcuno non invii richieste che fingono di essere un altro dominio.

Posso dare a ciascun dominio un'identità, ma la richiesta proviene dal lato client.

Sto utilizzando HTTPS nel mio dominio.

Supponiamo che esegua un server su A.com e autorizzo le persone a scaricare il mio SDK lato client JS e ad effettuare richieste al mio server. Quando ricevo una richiesta da B.com, ho bisogno di assicurarmi che questo sia il posto in cui si trova effettivamente il cliente.

È sufficiente SSL / HTTPS? Devo presumere che quando il mio server riceve una richiesta da un sito abilitato SSL posso fidarmi del 99,999% dell'URL nell'intestazione?

    
posta ydennis 30.10.2018 - 15:03
fonte

1 risposta

1

Non sono completamente sicuro di cosa intendi con questo

When I receive the request I want to verify the third party domain from which it originated - to ensure someone is not submitting requests pretending to be another domain.

Ad esempio, ecco la richiesta HTTP effettuata dal mio browser per caricare questa pagina:

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

Niente in là indica da quale dominio viene il mio browser web. Non sono nemmeno sicuro di sapere cosa significa.

Forse intendi che la tua API sarà accessibile da pagine servite da altri domini e vuoi estrarre l'intestazione Referrer: ?

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

In entrambi i casi, l'architettura client-server di HTTP significa che non vi è alcuna sicurezza qui; il client può letteralmente mettere tutto ciò che vuole nella richiesta e il server non ha modo di verificare se è "corretto". In questo caso, l'utilizzo di HTTP o HTTPS non fa alcuna differenza.

Considera il seguente comando cURL che mostra che posso creare una richiesta HTTP con qualsiasi testo di intestazione che desidero e quindi inviarlo a qualsiasi server che desidero:

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

Soluzione: mutuo-auth (aka "client auth") TLS

Sembra che la soluzione che stai cercando sia automatico TLS , progettato appositamente per forzare il client a dimostrare la sua identità prima che il server apra una connessione.

Ciò implicherebbe l'emissione di certificati per i tuoi clienti (proprio come con il tuo server), e quindi la configurazione del tuo server per accettare solo connessioni in entrata da certificati attendibili.

    
risposta data 30.10.2018 - 16:01
fonte

Leggi altre domande sui tag