Io lavoro nel reparto di assistenza di Heroku e hanno trascorso un po 'di tempo a discutere di questo con i nostri ingegneri di routing. Volevo pubblicare alcune informazioni aggiuntive per chiarire alcune cose su cosa sta succedendo qui.
L'esempio fornito nella risposta sopra ha avuto l'IP del client visualizzato per ultima coincidenza e questo non è realmente garantito. Il motivo per cui non è stato il primo è perché la richiesta di origine ha affermato che stava inoltrando per l'IP specificato nell'intestazione X-Forwarded-For
. Quando il router Heroku ha ricevuto la richiesta, ha semplicemente aggiunto l'IP che si collegava direttamente all'elenco X-Forwarded-For
dopo quello che era stato iniettato nella richiesta. Il nostro router aggiunge sempre l'IP collegato all'ADB di AWS di fronte alla nostra piattaforma come ultimo IP nell'elenco. Questo IP potrebbe essere quello originale (e nel caso in cui vi sia un solo IP, è quasi certamente), ma nell'istante in cui vi sono più IP concatenati, tutte le scommesse sono disattivate. La convenzione è sempre quella di aggiungere l'ultimo IP della catena alla fine della lista (che è ciò che facciamo), ma in qualsiasi punto della catena tale catena può essere modificata e possono essere inseriti diversi IP. In quanto tale, l'unico IP affidabile (dal punto di vista della nostra piattaforma) è l'ultimo IP nell'elenco.
Per illustrare, diciamo che qualcuno avvia una richiesta e aggiunge arbitrariamente 3 indirizzi IP aggiuntivi per l'intestazione X-Forwarded-For:
curl -H "X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4" http://www.google.com
Immaginate IP di questa macchina era 9.9.9.9 e che doveva passare attraverso un proxy (ad es. un proxy universitario di livello universitario). Diciamo che il proxy ha avuto un IP di 2.2.2.2. Supponendo che non fosse configurato per rimuovere le intestazioni X-Forwarded-For
(che probabilmente non sarebbe), si limiterebbe a virare l'IP 9.9.9.9 alla fine dell'elenco e passare la richiesta a Google. A questo punto, l'intestazione sarebbe simile a questa:
X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9
Tale richiesta sarà poi passare attraverso endpoint di Google, che aggiungerà IP del proxy universitaria di 2.2.2.2, quindi l'intestazione finalmente questo aspetto nei registri di Google :
X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9,2.2.2.2
Quindi, qual è l'IP del client? È impossibile dirlo dal punto di vista di Google. In realtà, l'IP del client è 9.9.9.9. L'ultimo IP elencato è 2.2.2.2 e il primo è 12.12.12.12. Tutto ciò che Google potrebbe sapere è che l'IP 2.2.2.2 è sicuramente corretto perché quello era l'IP effettivamente connesso al loro servizio, ma non saprebbero se quello era il client iniziale per la richiesta o meno dai dati disponibili. Allo stesso modo, quando in questa intestazione c'è un solo IP, questo è l'IP direttamente connesso al nostro servizio, quindi sappiamo che è affidabile.
Dal punto di vista pratico, questo IP sarà probabilmente affidabile maggior parte del tempo (perché la maggior parte delle persone non saranno preoccuparsi di spoofing loro IP). Sfortunatamente, è impossibile prevenire questo tipo di spoofing e quando una richiesta arriva al router Heroku, è impossibile per noi sapere se gli IP in una catena X-Forwarded-For
sono stati manomessi o meno.
Tutti i problemi di affidabilità a parte, queste catene IP devono sempre essere lette da sinistra a destra. Il client IP dovrebbe essere sempre l'IP più a sinistra.
Mi dispiace, ma che lingua è? Se non è Python, come faccio a farlo in python? – Cubetastic