Il problemaBest Practices per il passaggio di dati tra le pagine
Nel stack che abbiamo ri-uso tra i progetti, ci stanno mettendo un po 'troppi dati nella sessione per il passaggio dei dati tra le pagine. Ciò è stato utile in teoria perché impedisce manomissioni, attacchi di riproduzione e così via, ma crea tanti problemi quanti ne risolve.
La perdita di sessione stessa è un problema, sebbene sia principalmente gestito dall'implementazione di Session State Server (o utilizzando SQL Server). Ancora più importante, è difficile rendere il pulsante Indietro funzionante correttamente, ed è anche un lavoro extra per creare una situazione in cui un utente può, ad esempio, aprire la stessa schermata in tre schede per lavorare su diversi record.
E questa è solo la punta dell'iceberg.
Esistono soluzioni alternative per la maggior parte di questi problemi, ma mentre mi allontano, tutta questa frizione mi dà la sensazione che passare i dati tra le pagine utilizzando la sessione sia la direzione sbagliata.
Quello che voglio veramente fare qui è una buona pratica che il mio negozio può usare sempre per il trasferimento di dati tra le pagine e quindi, per le nuove app, sostituire le parti chiave del nostro stack che attualmente si basano su Session .
Sarebbe anche bello se la soluzione finale non si traducesse in montagne di codice idraulico piano.
Soluzioni proposte
sessione
Come accennato in precedenza, appoggiandosi pesantemente sulla sessione sembra come una buona idea, ma rompe il pulsante indietro e causa di alcuni altri problemi.
Ci possono essere dei modi per aggirare tutti i problemi, ma sembra un lavoro extra.
Una cosa che è molto piacevole nell'usare la sessione è il fatto che la manomissione non è un problema. Rispetto a passare tutto tramite QueryString non criptato, si finisce per scrivere molto meno codice di protezione.
Cross-pagina di invio messaggi
A dire il vero ho a malapena considerato questa opzione. Ho un problema con quanto strettamente accoppiato rende le pagine - se inizio a fare PreviousPage.FindControl ("SomeTextBox"), sembra un problema di manutenzione se mai voglio arrivare a questa pagina da un'altra pagina che forse non ha un controllo chiamato SomeTextBox.
Sembra limitato anche in altri modi. Forse voglio arrivare alla pagina tramite un link, per esempio.
querystring
Attualmente sto appoggiato verso questa strategia, come nei tempi antichi. Ma probabilmente voglio che il mio QueryString sia crittografato per renderlo più difficile da manomettere, e mi piacerebbe anche gestire il problema degli attacchi replay.
Su 4 ragazzi di Rolla, there's an article about this.
Tuttavia, dovrebbe essere possibile creare un HttpModule che si occupi di tutto ciò e rimuova tutte le operazioni di creazione di salsicce di crittografia dalla pagina. Abbastanza sicuro, Mads Kristensen has an article where he released one. Tuttavia, i commenti fanno sembrare che abbia problemi con scenari estremamente comuni.
Altre opzioni
Naturalmente questo non è uno sguardo esaustivo alle opzioni, ma piuttosto le principali opzioni che sto prendendo in considerazione. This link contiene un elenco più completo. Quelli che non ho menzionato come Cookie e Cache non sono appropriati allo scopo di passare i dati tra le pagine.
In chiusura ...
Così, come stai gestendo il problema del passaggio di dati tra le pagine? Quali trucchi nascosti hai dovuto aggirare, e ci sono degli strumenti pre-esistenti intorno a questo che li risolvono tutti in modo impeccabile? Do ti senti come se avessi una soluzione di cui sei completamente soddisfatto?
Grazie in anticipo!
Update: Solo nel caso non sto facendo abbastanza chiaro, da 'il passaggio di dati tra le pagine' di cui sto parlando, per esempio, passando una chiave CustomerID da una pagina CustomerSearch.aspx per Customers.aspx, dove il cliente sarà aperto e la modifica può avvenire.
Proprio come la crittografia dei commenti di per sé in realtà non risolve l'aspetto della sicurezza del passaggio degli ID in QueryString, rende solo molto più difficile temperare con loro. In un'applicazione protetta si tende ad avere una sorta di identità in sessione, ad esempio il nome utente. Quindi se hai una pagina Orders.aspx? OrderId = 1, nei tuoi livelli inferiori (servizio/azienda) puoi sempre inserire la logica di convalida per assicurarti che l'ordine recuperato da questo ID appartenga effettivamente all'utente che ha effettuato l'accesso all'applicazione. – e36M3
@ e36M3: buon punto. Questo strumento non indica come viene archiviato l'ID utente, è solo un livello sopra Richieste e Reindirizzamento. Quindi potrebbe essere certamente usato in questo modo, sarà sufficiente memorizzare il tuo ID utente in sessione e scrivere il codice di convalida. Sto sicuramente facendo la parte di validazione ora, anche se devo ammettere che sto memorizzando l'UserID in un cookie criptato che non è perfetto. Ma voglio provare a non fare affidamento sulla sessione. E questi non sono progetti di alto profilo. Sempre margine di miglioramento .. –
per favore puoi postare su github? Puoi risolvere il problema di un'altra persona ... – CodeArtist