Dovresti usare la parte frammento dell'URL, invece della porzione di ricerca per trasferire i segreti. Per validi motivi menzionati da altri, i parametri GET sono problematici, ma il frammento di URL ( #secret
) non si spegne nemmeno sul filo, rendendo impossibile l'intercettazione dall'esterno del computer.
Questo evita complicazioni CORS derivanti dal POSTing dei dati tra domini, ed è in realtà più sicuro del POST perché il segreto rimane locale alla macchina.
tutto quello che dovresti fare è collegare un hash anziché una query:
<a href="https://site2.com/auth?id=abc123 target=_blank>Log In</a>
diventa
<a href="https://site2.com/auth#abc123 target=_blank>Log In</a>
non sarai in grado di raggiungere il segreto trasmesso dal server del secondo sito, ma sarà disponibile per il JS della pagina come location.hash
o più esattamente, location.hash.slice(1)
.
Per quanto riguarda il problema minore della visibilità umana, puoi rimuovere il segreto dalla barra dell'URL della nuova pagina immediatamente dopo aver catturato il segreto chiamando location.hash="";
o per tenerlo fuori dalla cronologia del browser: history.replaceState("","","#");
.
Se utilizzi HTTPS per intero, il POST potrebbe essere sicuro e consentire più contenuti; l'hash (nei miei test) è limitato a circa 20kb nei browser più vecchi. Se hai solo bisogno di una chiave, l'hash è veloce, fisicamente sicuro, ampiamente compatibile e facile da usare.
EDIT:
seguendo questa nozione, puoi usare un'altra proprietà, questa visibilmente nascosta, chiamata window.name
. AFAIK, non è possibile utilizzare solo collegamenti HTML per questo, ci vuole un frammento di JS per organizzare. Puoi utilizzare un iframe con solo HTML, ma dovrai comunque leggere il valore di JS:
<iframe name=secret123 href=https://site2.com/auth></iframe>
all'interno del frame, window.name
verrà impostato su secret123
. La speciale proprietà name
si aggira tra i ricaricamenti della pagina e anche dopo la navigazione verso domini di terze parti, quindi se la pagina con frame continua a navigare, dovresti innanzitutto disinfettare tramite window.name="";
.
puoi anche usare facilmente il nome "trucco" su un popup lanciato da js: window.open("https://site2.com/auth", "secret123");