Come convalidare l'input dell'utente

5

Ho molti problemi a capire dove io come sviluppatore posso convalidare i dati che i miei utenti mi inviano. Diciamo per un semplice esempio che ho una pagina web in cui ha un semplice modulo che contiene tre campi:

Name -> text field
email -> text field
Lunch Choice -> Dropdown field
  values:
    Burger
    Hotdog
    Pizza

Una volta che l'utente invia il modulo, il nome e l'ordine vengono salvati e possono prelevare il pranzo il giorno successivo.

Se sono un utente malvagio e sono arrivato a questo sito e ho modificato l'html per dire che il valore della pizza è in realtà un'insalata e il valore dell'opzione è un altro valore.

Ora, quando il modulo viene inviato e salvato, alcuni dati non validi vengono inseriti nel database.

Dove posso fermare questo?

Il mio primo pensiero è stato quello di avere una convalida javascript, una chiamata ajax al server per assicurarmi che i valori richiesti siano validi. Sembra un'ottima idea, tranne che javascript viene eseguito sul client, non sul server, quindi è anche suscettibile di attacco.

Se lascio che l'utente invii il modulo e poi gestisca l'invio sul server e faccia il controllo lì, l'utente ha già inviato il modulo quindi dovrei fare una sorta di reindirizzamento al loro modulo?

Sono sicuro di non essere il primo sviluppatore ad avere domande sui titoli di input e mi chiedevo se esistesse una best practice per gestire questo tipo di problema.

Grazie in anticipo!

    
posta jacksonecac 29.06.2017 - 20:06
fonte

5 risposte

5

È una domanda di base. Dovresti convalidare TUTTO sul lato server. Il back-end è il posto giusto per fare convalide. Ovviamente le convalide javascript sono utili anche per guidare gli utenti standard nei valori giusti, ma per gli hacker (o qualsiasi utente avanzato) è molto facile da ingannare.

Si è appreso che hai un database sul back-end e sai che tipo di cibo è possibile assegnare a ciascun utente. È necessario verificare se il valore ricevuto è presente nel recordset valido. Se è ok puoi andare avanti con il tuo flusso di lavoro. In caso contrario, puoi mostrare un errore e interrompere il processo.

Un altro problema importante che dovrai affrontare non è solo il logico bypass. Fai attenzione ai caratteri speciali e filtra tutti i pericoli come virgolette singole, doppie virgolette, trattini, punti e virgola, ecc. Oppure affronterai anche un'iniezione di sql o un attacco XSS (cross site scripting). Questa è un'altra storia ... ma ne parlo perché è molto importante.

    
risposta data 29.06.2017 - 20:16
fonte
2

Oscar ha già pubblicato un'ottima risposta, ma in risposta ad alcune delle tue domande:

My first thought was to have some javascript validation, have an ajax call talk to the server to make sure the values requested are valid. This sounds like a great idea, except javascript runs on the client, not the server, so that is also susceptible to attack.

Sono cose che complicano le cose. Come hai detto tu, questo è suscettibile di attacco e inoltre, è completamente annullato quando Javascript è disabilitato nel browser.

If I let the user submit the form and then handle the submit on the server and do the checking there, the user has already submitted the form so I would need to do some kind of redirect back to their form?

Sì.

Tradizionalmente, se si desidera utilizzare la convalida JS, lo si fa per suggerire correzioni sul frontend. "Hey, non c'è @ nel tuo indirizzo email. Inserisci un indirizzo email valido." Questo ti consente di risparmiare il viaggio di andata e ritorno che descrivi sopra. Javascript non serve per rafforzare la sicurezza, ma per rafforzare l'esperienza utente.

Quindi, una volta inserito un indirizzo email valido e inviato il contenuto, non è più possibile per loro ignorare i meccanismi. La palla è nel tuo campo. Sul server controlli le cose cattive che Oscar menziona, disinfetta tutte le stringhe e se rilevi qualcosa di sbagliato, restituisci l'utente alla pagina di input (e se vuoi essere gentile, ripopola i campi del modulo utilizzando i valori sterilizzati ).

Quindi, a questo punto, anche se JS era disabilitato, l'utente riceve ancora un messaggio HTML che spiega che è necessario inserire un indirizzo email valido. Sì, questo significa creare due diversi set di messaggi di errore, uno per JS, uno in HTML (motivo per cui personalmente non mi preoccupo mai della convalida JS).

Fai attenzione a rivisualizzare i contenuti che ti hanno fornito. Se incorporano codice dannoso nelle stringhe, visualizzarli sulla pagina risultante senza disinfettarli prima possono finire male.

    
risposta data 29.06.2017 - 22:28
fonte
2

Esecuzione della convalida dell'input significa controllare l'input per essere sicuri di poterlo elaborare. La parte difficile è che, convalidandolo, stai già eseguendo qualche piccola elaborazione e questo può creare una vulnerabilità nascosta.

Il primo passo consiste in genere nella convalida della lunghezza dell'input. La maggior parte degli input finirà temporaneamente in un buffer finito. Assicurati che la quantità di input che copi nel buffer non superi la lunghezza del buffer: se c'è troppo input e non abbastanza buffer, questo può creare un classico problema di "buffer overflow"; sfruttarli è una base degli hacker.

Il prossimo passo è garantire che i dati siano nel formato che ti aspetti. Se stai aspettando un numero, assicurati che i byte contengano solo cifre e simboli numerici consentiti, come più, meno, separatore, punto decimale, simbolo di valuta, ecc. Si noti che questi sono specifici delle impostazioni locali: negli Stati Uniti, un milione di dollari potrebbe essere inserito come 1,000,000.00 , mentre in Germania è possibile inserire un milione di euro come 1.000.000,00 . Se ti aspetti caratteri e numeri alfanumerici, utilizza una "lista bianca" per accettare solo i caratteri che ti aspetti. È più sicuro fare affidamento su una lista bianca di buoni personaggi rispetto a una lista nera di personaggi cattivi; la tua lista nera potrebbe mantenerti al sicuro con la tua configurazione a partire da oggi, ma supponiamo che qualcuno in futuro sostituisca il tuo database con un altro database. È possibile che uno dei caratteri imprevisti consenta un'iniezione SQL. Lo stesso vale per lo scripting e l'HTML.

Notare che se si annullano questi controlli e si verificano i caratteri speciali prima di verificare la lunghezza dell'input, il codice di convalida potrebbe essere vulnerabile a un overflow del buffer. È importante eseguirli nell'ordine che ti mantiene più sicuro.

Quindi il prossimo passo è codificare appropriatamente l'input. Ad esempio, se accetti < e > e metti i risultati su una pagina web, probabilmente vorrai assicurarti di codificare in HTML i simboli in modo da non creare inavvertitamente un buco dove un utente malintenzionato può piantare un <script>attack!</script> nella pagina di output.

Si consiglia inoltre di tentare di proteggere contro le iniezioni SQL qui (proteggere qualcuno che inserisce qualcosa di brutto come ' OR 1=1;DROP TABLE STUDENTS-- , ma questa è un'arma a doppio taglio, perché non garantisce completamente la protezione. un controllo di validazione contro l'accettazione del carattere di apostrofo La riga di difesa successiva deve essere nel codice che si interfaccia con SQL e che il codice deve essere responsabile dell'esecuzione sicura delle query (utilizzando query SQL parametrizzate, ORM o altre strategie difensive). Potresti testare il tuo input con il suddetto attacco SQL injection e non trovare un difetto perché conosci solo un tipo di attacco di iniezione, ma supponiamo che l'hacker calcoli una nuova via di attacco e cerchi di usare la codifica HTML per ottenere attorno al tuo assegno, e scopre che hai dimenticato di testare e / o sanitizzare contro quel tipo di input. Potresti comunque essere vulnerabile a meno che tu non stia attento con la codifica SQL.Questo è un piccolo esempio di come una difesa in la strategia di profondità può aiutarti a rimanere al sicuro.

    
risposta data 30.06.2017 - 00:04
fonte
1

Per evitare di scrivere dati imprevisti nel database, convalidarlo sul lato server, subito dopo che il modulo è stato inviato, dallo script / processo che lo riceve.

Qualsiasi dato ricevuto da una fonte esterna dovrebbe essere considerato potenzialmente dannoso, quindi ogni processo che lo riceve dovrebbe sanitizzarlo prima dell'elaborazione.

L'obiettivo di convalida lato client è quello di fornire un'interfaccia user-friendly. L'obiettivo di convalida lato server è garantire che l'input dell'utente sia amichevole.

Raccomando il input cheat sheet di OWASP e Cheat Sheet di SQL Injection Prevention .

    
risposta data 29.06.2017 - 22:35
fonte
0

Convalidare e disinfettare tutti gli input utente

Esistono fondamentalmente due tipi di validazione , uno è essenziale (lato server) uno è auspicabile per UX (lato client)

Convalida lato client

Convalida sul lato client che si verifica nel browser, prima che i dati siano stati inviati al server. Questo è più user-friendly della convalida lato server in quanto fornisce una risposta immediata.

All'interno di ciò vi sono gli approcci basati sulla convalida basata sul browser e gli API basati su vincoli HTML5 / JS.

  • La convalida del modulo integrata viene eseguita con le funzionalità di convalida del modulo HTML5 e, in genere, non richiede JavaScript. Questo ha prestazioni migliori, ma non è così personalizzabile.

  • La convalida JavaScript è codificata utilizzando JavaScript. È completamente personalizzabile ma anche completamente sovrascrivibile e bypassabile

Convalida lato server

La convalida lato server è la convalida che si verifica sul server, dopo che i dati sono stati inviati - il codice lato server è usato per convalidare i dati prima di essere inserito nel database, e se è sbagliato viene inviata una risposta al cliente per dire all'utente cosa è andato storto. La convalida lato server non è user-friendly come la convalida lato client, poiché richiede un round trip sul server, ma è essenziale: è l'ultima linea di difesa dell'applicazione contro i dati non validi. Tutti i più diffusi framework sul lato server hanno funzionalità per la convalida e la disinfezione dei dati (rendendoli sicuri).

Credito al fantastico mozilla progetto per il testo sopra e assolutamente consigliato la lettura.

    
risposta data 05.07.2017 - 13:58
fonte

Leggi altre domande sui tag