Il tuo caso d'uso non è contestualmente diverso dalla visualizzazione di un semplice modulo a pagina singola che l'utente non è riuscito a compilare correttamente, e per comodità il tuo codice server ha riempito nuovamente i campi che l'utente ha compilato correttamente. Vediamo molti di questi esempi sul web. L'unica differenza è che utilizzi due pagine per un set completo di dati utente obbligatori (e facoltativi) che stai raccogliendo. Potresti anche usare venti di questi passaggi, non ha importanza dal punto di vista della sicurezza (potrebbe essere così per gli utenti, ma è diverso), a patto che:
- Ti sei occupato di TLS
- Tratti tutti gli input dell'utente, indipendentemente dalla pagina da cui provengono, nel complesso
- Non esporre inutilmente le password di testo in chiaro nella cache dell'utente finale
Hai menzionato nei commenti che questo sarà su HTTPS, quindi il primo è curato. Entrambi gli altri due sono completamente gestibili:
Il codice lato server che verifica l'input dell'utente dovrà essere scritto in modo tale da adattarsi a più pagine di moduli utente, ma anche controllare i vincoli di input in modo incrementale, vale a dire che ogni nuova pagina controllerà tutti i dati inseriti su quelli precedenti , fino alla pagina in cui l'utente è attualmente attivo. Accettate anche tutti questi moduli separati nel loro insieme, il che significa che un errore su uno ripristina la visualizzazione di quel particolare stadio di input dell'utente finale , rilascia tutti i dati del modulo successivo e visualizza i relativi errore per quella pagina (o fase, passaggio, comunque tu vuoi chiamarlo). La parte importante è che accetti tutti gli input dell'utente solo dopo che tutti i dati sono stati verificati in base alle tue esigenze in tutte le fasi di inserimento del modulo. Solo così puoi tranquillamente scrivere qualsiasi cosa nel tuo database - cioè tutti i requisiti sono stati soddisfatti.
Perché non inviare le password degli utenti finali in cancella testo non è un problema? Perché l'hai già inviato almeno una volta nella direzione opposta al server. Se questo non dovrebbe essere un problema, rimandarlo indietro usando lo stesso TLS non dovrebbe altrettanto bene. Non dovrebbe , perché dovrai ancora considerare questi dati memorizzati nella cache dell'utente dal browser, come ha sottolineato @ThomasPornin. Ciò è tuttavia controllabile con i tag di intestazione della cache del browser, sia come tag HTML, sia nelle intestazioni di risposta del server HTTP. Non entrerò nei dettagli su come ottenerlo, in quanto è un argomento ben trattato e ha anche molte discussioni su StackOverflow. Il principale punto d'appoggio è che se il tuo front-end è già stato aperto con una iniezione XSS, nulla impedisce a questa iniezione di raccogliere i dati degli utenti finali sul modulo di invio dallo stesso campo di input, quindi inviarlo di nuovo non lo espone realmente più per questi tipi di attacchi, ma la cache del client dovrebbe essere ancora considerata per impedire l'esposizione di password di testo in chiaro ad altri tipi di attacco.
Altri hanno anche suggerito di utilizzare AJAX per parti dei dati del modulo. Se è vero che può aiutare con l'input dell'utente, guidando gli utenti mentre vanno con feedback, non dovresti mai accettare solo i dati parziali come qualcosa su cui contare in seguito, quando completi una fase di invio del modulo o quando completi il processo nel suo insieme. Controllare la disponibilità del nome visualizzato o simile è perfetto, ma se è nel frattempo preso da un altro utente, non è certo il caso di fare affidamento su quella richiesta AJAX precedente per decidere, se l'utente corrente continua a usarlo.