La convalida del modello di input HTML5 è sufficiente (o anche rilevante) per la validazione lato client?

23

Una caratteristica interessante di HTML5 è l'attributo <input pattern="" /> , che consente al browser di convalidare il valore del campo di input rispetto a un'espressione regolare fornita dallo sviluppatore.

Successivamente, questo si lega al campo ValidityState che può quindi essere interrogato per feedback UX, per impedire l'invio non valido e così via.

Il server implementa la stessa convalida di precondizione (così come XSRF).

Dato questo, questo modello di convalida sul lato client è maturo e adeguato , o per qualche motivo è ancora desiderabile intercettare l'intera forma e sottoporla alla tradizionale convalida per campo prima di inviarla?

    
posta msanford 19.09.2017 - 15:43
fonte

5 risposte

108

Dal punto di vista della sicurezza, è necessario riconvalidare tutto sul server. Questo sarà sempre il caso, a prescindere da quanto diventino le funzionalità HTML5 graziose e avanzate. Semplicemente non puoi fidarti del cliente. Non hai idea se seguirà le regole HTML5 o meno. Non sai nemmeno se si tratta di un browser.

Quindi dovresti convalidare l'intero modulo con il tuo lato client JS prima di inviarlo, anche se usi le funzionalità HTML5? Dal punto di vista della sicurezza, non importa. La convalida lato client ha comunque zero valori di sicurezza - vedi sopra - quindi, dal punto di vista della sicurezza, potresti anche non preoccuparti di farlo affatto.

La validazione lato client riguarda esclusivamente l'esperienza dell'utente. Se la tua convalida JS o HTML5 integrato per la miglior UX è una domanda interessante, ma qui non è sull'argomento.

    
risposta data 19.09.2017 - 15:50
fonte
14

Una spiegazione con codice e schermate

Le risposte fornite sono grandiose. Ma volevo illustrarlo con codice / schermate.

La linea di fondo è che tutto il lato client può essere manipolato (disabilitato / completamente eliminato / bypassato o modificato) dall'utente finale. Quindi qualsiasi tipo di "validazione lato client" è totalmente inutile dal punto di vista della sicurezza. Devi sempre convalidare le cose lato server.

Supponiamo che tu abbia un modulo HTML come questo:

<form method="post" action="index.php">
    <input type="email" name="emailAddress" required>
    <button type="submit">Submit form</button>
</form>

Si tratta di un indirizzo email ( type="email" ), che dice che è un campo obbligatorio (attributo required ).

Se provo a inviare qualcosa che è vuoto o meno a un indirizzo email, si verificherà un errore, ad es.

Perchéquestoèinutiledalpuntodivistadellasicurezza?Tuttociòchel'utentedevefareèmanipolarel'HTML.PossonofarlosalvandounacopiadellapaginaWeb,modificandolaeriaprendo.OppurepossonoutilizzaregliStrumentipersviluppatorinelpropriobrowserpermodificareilmarkup.Possonofarloperchésitrattadicodicelatoclient,edèsottoillorocontrollo.

Diciamochecambioilmarkupdelmoduloinquestomodo:

<formmethod="post" action="index.php">
    <input type="text" name="emailAddress">
    <button type="submit">Submit form</button>
</form>

Ora sto dicendo che il campo emailAddress è di tipo text (cioè non email ) e non è un campo obbligatorio (attributo required rimosso).

Quindi posso inviarlo al server. La stringa di testo "andy" non è ovviamente un indirizzo email valido. Ma dal momento che non abbiamo alcuna validazione sul lato server (ancora) sarà felicemente postata sul server e quindi se il codice PHP ha usato $_POST['emailAddress'] avrebbe "andy" come i suoi dati.

Potreiancheinviareilmodulosenzadati,nelqualcasol'applicazione,senzaalcunaconvalidasullatoserver,avrebbeunastringavuotanellavariabile$_POST['emailAddress'].

Questoerapossibilesoloperchéiocomeutentefinalepotevomanipolareilcodicelatoclient.

Perchélaconvalidalatoserverèprotetta?L'utentefinalenonpuòmanipolareilcodicelatoserver(amenocheilservernonsiastatocompromesso,masitrattadiunproblemaseparatoenondiunacosafacilecomemanipolareHTMLperlapersonamedia).

Quindi,inPHP,potreifareuncontrollocomequesto:

if(!filter_var($_POST['emailAddress'],FILTER_VALIDATE_EMAIL)){die('Invalidemailaddress');}

Sebbenesitrattidiunmetododigestionedeglierrorinonamichevole,interromperàl'esecuzionedelloscriptsel'utenteinvia"andy" invece di un indirizzo email valido. L'applicazione quindi non userà mai "andy" come variabile in attesa di un indirizzo di posta elettronica. Poiché l'utente finale non può manipolare il codice PHP sopra, ci sono meno possibilità che possano bypassare la convalida. Questa è la convalida lato server - non può essere (facilmente) modificata da un utente finale perché non è sotto il loro controllo modificarla.

Perché preoccuparsi della convalida del lato client? La convalida del lato client è utile per i miglioramenti dell'interfaccia utente "di bell'aspetto" o, ad esempio, per i messaggi di errore / disattivazione dei campi modulo. Ad esempio, è probabilmente una buona caratteristica dell'interfaccia utente avere quel messaggio sul primo screenshot nel caso in cui l'utente mis-digita un indirizzo email. Il modulo non verrà nemmeno inviato sotto la prima serie di condizioni, riducendo così i dati non necessari inviati al server. Ma alla fine, qualsiasi cosa fatta sul lato client può essere cambiata dall'utente finale. Quindi non è assolutamente sicuro e non si dovrebbe mai pensare a "validazione lato client" quando si tratta di pratiche di sicurezza. Qualsiasi validazione lato client è in gran parte solo per i miglioramenti dell'interfaccia utente.

La convalida lato client è utile anche per le applicazioni lato client (quando non richiede / invia a un server). Ad esempio se avevi il modulo di cui sopra e poi hai visualizzato il contenuto di emailAddress in un <div> nella pagina leggendolo con JavaScript / jquery. Se l'utente ha inserito qualcosa come <script>alert('hello!');</script> e non è stata convalidata, genera un avviso quando JavaScript ha tentato di scrivere il valore nel campo su <div> . Nulla viene pubblicato sul server in questo caso - tutto accade sul lato client - quindi ancora una volta la validazione lato client è utile in questo tipo di scenario. Tuttavia, si applica la stessa logica in quanto un utente può ancora disabilitare la convalida. L'impatto qui è più basso perché se eseguissero il codice sopra sarebbe accaduto solo sulla loro macchina locale, non ad altri utenti dell'applicazione. Ad esempio:

Utilizzandoilseguentecodice(senzaalcunaconvalida):

<formmethod="post" action="#">
    <input type="text" name="emailAddress" id="emailAddress" size="100">
    <button type="submit">Submit form</button>
</form>

<div id="test"></div>

E jquery per scrivere il contenuto del modulo in <div> con l'ID test :

$(document).ready(function() {
    $("button").click(function(e) {
        e.preventDefault();

        $("#test").html($("#emailAddress").val());
    });
});
    
risposta data 20.09.2017 - 17:27
fonte
5

Come dichiarato da Anders, la validazione lato client è irrilevante per la sicurezza dell'applicazione, ma molto importante dal punto di vista di UX.

La convalida lato client è focalizzata o fornisce all'utente un tempo più agevole e più semplice durante il riempimento dei moduli, l'esempio migliore che conosco è il plug-in di jQuery Masks, che può essere utilizzato per limitare le dimensioni e il pattern dell'input e fornire un feedback visivo per l'utente. Questo può aiutarti in problemi di non sicurezza, come ricevere dati dagli utenti in un modello diverso dal previsto sul lato server, ma è facilmente ignorato da qualsiasi utente malintenzionato.

tl; dr - Non esiste una validazione del lato client sufficiente, semplicemente non fidarsi del client, basta trattare tutto ciò che è stato ricevuto sul server prima di elaborarlo.

    
risposta data 19.09.2017 - 17:36
fonte
1

Nessuna delle risposte finora lo menziona veramente, quindi permettimi di aggiungere questo:

Il motivo per cui qualsiasi cosa nel tuo codice HTML è completamente irrilevante per la sicurezza è che qualsiasi aggressore può, banalmente, creare richieste senza nemmeno caricare alcun HTML nel browser (digitando una richiesta nella console, o usando qualche plugin). In realtà, senza nemmeno avviare il browser (c / f curl , wget o qualsiasi linguaggio di programmazione).

La parte rilevante per queste cose sono le richieste HTTP . Non il payload HTML. E a parte il livello TLS / SSL, non c'è nulla che salvaguardi il contenuto della richiesta HTTP dalla persona che sta creando la richiesta.

Quindi, tutta la sicurezza deve avvenire sul lato server. Qualsiasi controllo sul lato client è solo lì per un'esperienza utente migliore (saltando un roundtrip).

    
risposta data 21.09.2017 - 14:49
fonte
1

Le convalide HTML si applicano solo a coloro che non sanno come modificare il codice html dal lato client. Queste convalide html possono essere facilmente rimosse e manipolate dal lato client Avere sempre una corretta convalida sul tuo db.

    
risposta data 21.09.2017 - 18:29
fonte

Leggi altre domande sui tag