2012-01-27 14 views
14

Sto lavorando a uno strumento basato sul web che semplifica il lavoro che svolgiamo nel mio ufficio. Gli strumenti forniti dal nostro partner hanno un accesso generico utilizzato dall'intero piano, ma scade ogni 30 minuti, il che è fastidioso dover effettuare di nuovo il log-in per tutto il giorno.

Ciò che avevo fatto in passato, era creare un iframe nascosto nel mio strumento che si connettesse inviando un modulo nascosto al caricamento della pagina e continuando a inviare il modulo ogni 30 minuti per evitare un timeout. Possono quindi inviare ricerche allo strumento partner direttamente dal mio strumento (tramite un altro modulo visibile).

Mi piacerebbe utilizzare jQuery $.post() per eliminare entrambi gli iframe nascosti e renderlo così l'unica volta in cui invia le informazioni di accesso è quando viene eseguita una ricerca. In questo modo non inviano richieste ininterrottamente quando non sono in uso, ma puoi comunque eseguire una ricerca senza doversi preoccupare del timeout del login.

Sembrerebbe che la stessa politica di origine delle antenne lo stia impedendo, quindi al momento sto solo aprendo una nuova finestra con nome e quindi inviando due moduli nascosti nella finestra di destinazione uno dopo l'altro.

Il problema è che se la richiesta di accesso non è stata completata, la richiesta di ricerca non viene eseguita e vengono nuovamente indirizzati alla pagina di accesso. Se chiudono la finestra e ricominciano, funzionerà, ma anche questo è fastidioso, non tanto quanto la situazione originale.

Quindi, a parte il fatto che è necessario vedere la pagina aperta (a meno che non si trovi in ​​un iframe nascosto) qual è la differenza tra l'invio di parametri tramite $.post() e l'invio di un modulo utilizzando il metodo POST? Sembrano identici a Firebug. C'è un modo per impostare una richiamata sull'invio del modulo, quindi aspetta che la prima richiesta venga completata prima di iniziare il secondo?

risposta

21

$ .post utilizza xmlhttprequest per inviare dati. Xhr è limitato tramite cors. L'invio di una richiesta HTTP POST non lo è.

+0

Non riesco a indovinare perché questo non è stato votato. Sembra corretto per me. +1 –

+0

Remoto rimosso.Ho pensato che l'utente stesse chiedendo una spiegazione * perché * solo XHR ha le restrizioni - questo è il problema se il soggetto è una domanda completa che differisce dal corpo e la gente legge il soggetto con attenzione: p – ThiefMaster

+0

è un modo per inviare una scala Richiesta POST HTTP senza effettivamente aprire la pagina? – sicks

-2

La politica della stessa origine di ajax consiste nel interrompere l'invio delle informazioni in rete sul proprio server personale, senza che si accorga che ciò accada. I post della pagina ad altri server non sono raccomandati e potrebbero non riuscire.

Puoi risolvere il problema? È possibile sostituire il modulo di invio con jq per attendere che lo stato di accesso sia completato, quindi inviare il modulo, tuttavia, non sono sicuro che questa sia una buona idea: un ciclo di rotazione di solito indica un errore di progettazione.

Quanto controllo ha il codice? Puoi fare il submit fare un login, e al ritorno inviare la ricerca? O effettuare la ricerca non richiede il login?

+0

In questo momento invia l'accesso e quindi la ricerca, ma non c'è modo di sapere se la richiesta di accesso è stata completata prima di effettuare la ricerca. – sicks

+0

"I post della pagina su altri server non sono consigliati e potrebbero non riuscire." metadaddy

15

Quando si esegue una richiesta POST a un altro dominio, non sarà possibile accedere alla risposta con JavaScript (anche se si invia il modulo a un iframe).

Quando si utilizza XHR, tuttavia, si ha pieno accesso alla risposta, quindi si potrebbero fare molte cose negative - ad es. accedere alle pagine in cui l'utente è loggato, curiosare nella sua intranet aziendale ecc.

Quindi le restrizioni XHR non devono evitare CSRF ma evitare la divulgazione di informazioni privilegiate.

+0

Puoi farlo? Se invio una richiesta di posta in un client http non elaborato (come ad esempio curl), ho accesso alla risposta e devo ancora vedere le opportunità che descrivi. Come avrebbe il javascript avere un vantaggio su una libreria http con accesso a più risorse? E se avessi semplicemente usato un browser che non impone la stessa politica di origine, che viene imposta a livello del client, non del server? – Anthony

+0

Quando si utilizza un client HTTP * l'utente * avvia la richiesta e controlla quali dati (ad esempio i cookie di accesso) inviati. Ma di solito non hai il controllo sul codice JavaScript utilizzato da un sito web. Ad esempio, qui su Stack Overflow è sufficiente una semplice richiesta GET per visualizzare le informazioni privilegiate disponibili solo per i moderatori. Ora un altro sito web potrebbe (se non è stato disabilitato tramite l'intestazione x-frame-policy) utilizzare un iframe che punta a un URL contenente tali informazioni - ma grazie alla politica dell'origine stessa non ha modo di accedere ai dati su questo pagina. – ThiefMaster

+0

Sì, ma è per questo che la stessa politica di origine è valida e valida. Hai indicato che i post dei moduli su ajax erano più vulnerabili a causa dell'accesso di js alla risposta mettendo a rischio il server più di qualsiasi attacco xhr. Penso che volevi dire che la stessa politica di origine (in generale e non specifica per la domanda OP) protegge il server tanto quanto l'utente. Un punto valido, ma la tua risposta suggerisce che è specifico formulare post, che potrebbero indurre i lettori a pensare che ci sia qualche altro meccanismo in atto oltre alla stessa politica di origine. – Anthony

Problemi correlati