Come altri hanno già detto, dovresti fare entrambe le cose. Ecco perché:
Dalla parte del cliente
Desideri convalidare prima l'input sul lato client perché puoi fornire un feedback migliore all'utente medio . Ad esempio, se inseriscono un indirizzo e-mail non valido e passano al campo successivo, è possibile mostrare immediatamente un messaggio di errore. In questo modo l'utente può correggere tutti i campi prima di inviare il modulo.
Se esegui la convalida solo sul server, devono inviare il modulo, ricevere un messaggio di errore e provare a cercare il problema.
(Questo problema può essere attenuato facendo in modo che il server ritorni il modulo con l'input originale dell'utente compilato, ma la convalida sul lato client è ancora più veloce.)
Lato server
Vuoi convalidare sul lato server perché puoi proteggerti da un utente malintenzionato , che può facilmente aggirare il tuo JavaScript e inviare input pericolosi al server.
È molto pericoloso fidarsi dell'interfaccia utente. Non solo possono abusare dell'interfaccia utente, ma potrebbero non utilizzare affatto l'interfaccia utente o persino un browser . Cosa succede se l'utente modifica manualmente l'URL o esegue il proprio Javascript o modifica le richieste HTTP con un altro strumento? Che cosa succede se curl
, ad esempio, inviano richieste HTTP personalizzate da o da uno script?
( Questo non è teorico; ad esempio, ho lavorato su un motore di ricerca di viaggi che ha inviato nuovamente la ricerca dell'utente a molte compagnie aeree partner, compagnie di autobus, ecc., Inviando POST
richieste come se l'utente avesse compilato il modulo di ricerca di ciascuna società, quindi raccolto e ordinato tutti i risultati. Il modulo JS di quelle società non è mai stato eseguito ed è stato fondamentale per noi fornire messaggi di errore nell'HTML restituito. Ovviamente un'API sarebbe stata piacevole, ma questo era ciò che dovevamo fare. )
Non consentire ciò non è solo ingenuo dal punto di vista della sicurezza, ma anche non standard: un client dovrebbe essere autorizzato a inviare HTTP con qualsiasi mezzo desiderino e si dovrebbe rispondere correttamente. Ciò include la convalida.
La convalida lato server è importante anche per la compatibilità : non tutti gli utenti, anche se utilizzano un browser, avranno JavaScript abilitato.
Addendum - dicembre 2016
Esistono alcune convalide che non possono nemmeno essere eseguite correttamente nel codice dell'applicazione lato server e sono assolutamente impossibili nel codice lato client , poiché dipendono dallo stato corrente del database. Ad esempio, "nessun altro ha registrato tale nome utente" o "il post del blog su cui stai commentando esiste ancora" o "nessuna prenotazione esistente si sovrappone alle date richieste" o "il saldo del tuo account ha ancora abbastanza per coprire tale acquisto ". Solo il database può validare in modo affidabile i dati che dipendono dai dati correlati. Gli sviluppatori lo rovinano regolarmente , ma PostgreSQL offre alcune buone soluzioni .