Domanda

Dove metti la convalida dell'input dell'utente in un'applicazione per moduli web?

  1. Visualizza: lato client JavaScript
  2. Controller: lingua lato server (C # ...)
  3. Modello: database (stored procedure o dipendenze)

Penso che ci sia una convalida richiesta da ogni livello:

  1. L'utente ha inserito un valore sano?
    • sono date date effettive, sono numeri in realtà numeri ...
  2. Esegui nuovamente tutti i controlli in 1. più i controlli per attacchi dannosi (IE XSS o SQL injection)
    • I controlli effettuati in 1. servono principalmente ad evitare un round trip del server quando l'utente commette un errore.
    • Dal momento che vengono eseguiti sul lato client in JavaScript, non ci si può fidare che siano stati eseguiti. La convalida di nuovo di questi valori fermerà alcuni attacchi malevoli.
  3. Sono soddisfatte le dipendenze (es. l'utente ha aggiunto un commento a una domanda valida)
    • Una buona interfaccia rende questi molto difficili da violare. Se qualcosa viene catturato qui, qualcosa è andato molto storto.

[ispirato a questa risposta ]

È stato utile?

Soluzione

Controllo tutti i livelli, ma vorrei notare un trucco di convalida che utilizzo.

Convalido a livello di database, i vincoli appropriati sul modello forniranno la convalida automatica dell'integrità dei dati.

Questa è un'arte che sembra essere persa sulla maggior parte dei programmatori web.

Altri suggerimenti

Convalida nel modello, opzionalmente routine automatizzate nell'interfaccia utente che traggono i loro suggerimenti dal modello e migliorano l'esperienza dell'utente.

Per routine automatizzate intendo che non ci dovrebbe essere alcun codice di validazione per modello nell'interfaccia utente. Se disponi di una libreria di metodi di convalida, come RoR (che ha metodi come validates_presence_of: nome utente), il controller o la vista dovrebbero essere in grado di leggerli e applicare metodi javascript equivalenti (o qualunque sia conveniente).

Ciò significa che dovrai duplicare l'intera libreria di validazione nell'interfaccia utente o almeno fornire una mappatura se ne usi una preesistente. Ma una volta fatto, non dovrai scrivere alcuna logica di validazione al di fuori del modello.

La convalida può essere effettuata su tutti i livelli.

La convalida dell'input da un modulo Web (tutte le stringhe, il casting in tipi appropriati, ecc.) è diversa dalla convalida dell'input da un servizio Web o da un file XML, ecc. Ognuno ha i suoi casi speciali. Puoi ovviamente creare una classe helper di validazione, esternalizzando così la validazione e permettendole di essere condivisa dalle viste.

Quindi hai la validazione del livello DAO - ci sono abbastanza dati nel modello per persistere (per soddisfare vincoli non nulli, ecc.) e così via. Puoi anche avere vincoli di controllo nel database (è lo stato in ('N', 'A', 'S', 'D') ecc.)

Questo è interessante. Per molto tempo ho eseguito tutte le convalide nel modello, proprio sopra quello che considererei DAL (livello di accesso ai dati). I miei modelli sono in genere modellati secondo il gateway dati della tabella con un DAL che fornisce l'astrazione e API di basso livello.

A fianco del TDG implementerei la logica aziendale e le convalide, come:

  1. Il nome utente è vuoto
  2. Nome utente > 30 caratteri
  3. Se il record non esiste, restituisci errore

Man mano che la mia applicazione cresceva in complessità, ho iniziato a rendermi conto che gran parte della validazione poteva essere eseguita sul lato client, usando JavaScript. Quindi ho refactored la maggior parte della logica di validazione in JS e ho ripulito i miei modelli.

Poi ho capito che la validazione lato server (non filtraggio / escape - che considero diversa) dovrebbe essere eseguita anche nel server e solo lato client come ciliegina sulla torta.

Quindi, quando mi sono reso conto di nuovo, la logica di validazione è andata avanti, e probabilmente c'era una netta differenza tra validazione / asserzione INPUT e regole / logica commerciale.

Fondamentalmente se può essere fatto sul lato client dell'applicazione (usando JS) lo considero una validazione INPUT ... se DEVE essere fatto dal modello (esiste già questo record, ecc?) considererebbe quella logica di business. Ciò che confonde è che entrambi proteggono l'integrità del modello di dati.

Se non convalidi la lunghezza di un nome utente, cosa impedisce alle persone di creare un nome utente a carattere singolo?

Non ho ancora del tutto deciso dove mettere la logica successiva, penso che dipenda davvero da ciò che preferisci di più, controller sottili, modelli pesanti o viceversa ...

I controller nel mio caso tendono ad essere molto più incentrati sull'applicazione, mentre i modelli se realizzati con cura posso spesso riutilizzarli in "altro". progetti non solo internamente, quindi preferisco mantenere i modelli leggeri e i controller più pesanti.

Le forze che ti spingono in entrambe le direzioni sono l'opinione personale, i requisiti, le esperienze, ecc ...

Soggetto interessante :)

La convalida deve essere effettuata nel controller - è l'unico posto che garantisce sicurezza e risposta.

La convalida dovrebbe essere eseguita nella vista: è il punto di contatto e fornirà la migliore UE e risparmierà il tuo lavoro extra sul server.

La convalida verrà eseguita sul modello, ma solo per un certo livello di controllo di base. I database dovrebbero sempre riflettere i vincoli appropriati, ma è inefficiente lasciare che ciò rappresenti una vera convalida, né è sempre possibile per un database determinare input validi con semplici vincoli.

Tutta la validazione dovrebbe avvenire almeno una volta, e questo dovrebbe essere nel livello intermedio, sia che si tratti dei tuoi oggetti valore (nel senso DDD, da non confondere con i DTO), o attraverso l'oggetto business dell'entità si. La convalida lato client può verificarsi per migliorare l'esperienza dell'utente. Tendo a non fare la convalida lato client, perché posso semplicemente esporre tutte le cose che sono sbagliate sul modulo in una volta, ma questa è solo la mia preferenza personale La convalida del database può verificarsi per assicurare l'integrità dei dati nel caso in cui tu abbia rovinato la logica in il livello intermedio o il retro terminavano qualcosa.

Lo faccio solo in View and Controller, il database impone un po 'di quello dai tuoi tipi di dati e quant'altro, ma preferirei che non arrivasse così lontano senza che io rilevi un errore.

Hai praticamente risposto alla tua domanda, la cosa importante da sapere è che non puoi mai fidarti della vista, anche se questo è il percorso più semplice per fornire feedback all'utente, quindi devi disinfettare almeno un altro livello.

Hmmmm, non sono sicuro. Avrei detto il controller fino a quando non ho letto questo articolo in riferimento a: controller skinny, modelli fat

http://blog.astrumfutura.com/archives/373-The-M-in-MVC-Why-Models-are-Misunderstood-and-Unappreciated.html

Poiché la maggior parte delle convalide dipende dalle regole aziendali , eseguo la convalida sul livello aziendale come classi di strumenti di terze parti. Esistono altri tipi di convalide, come l'input dell'utente, mentre deve essere effettuato nel controller, ma è possibile incapsulare tali regole di convalida anche in classi di terze parti. In realtà, dipende da cosa convalidare.

Le convalide sul lato client sono quelle secondarie, appena realizzate per creare una convalida dell'input , ma la convalida sul lato server è richiesta sempre . Non puoi mai fidarti dell'input dell'utente;)

.NET ha dei buoni controlli per costruire convalide, ma il livello aziendale ha sempre bisogno di un approccio migliore per convalidare i dati e quei controlli non sono sufficienti per quell'attività.

Convalida dell'input semplice nella vista. Convalida completa nel modello. Ragionare? Se si modifica la tecnologia di visualizzazione e la convalida si trova nella vista / controller, è necessario riscrivere la convalida per la nuova vista. Questo può introdurre bug. Inseriscilo nel modello e questo viene riutilizzato da tutte le viste ...

Ma, come ho già detto, una semplice convalida in vista della velocità e della facilità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top