Convalida dei caratteri consentiti o convalida dei caratteri non consentiti

2

Ho sempre convalidato il mio input utente in base a un elenco di caratteri validi / consentiti, piuttosto che a un elenco di caratteri non validi / non consentiti (o semplicemente nessuna convalida). È solo un'abitudine che ho preso, probabilmente su questo sito e non l'ho mai messo in discussione fino ad ora.

Ha senso se si desidera, ad esempio, convalidare un numero di telefono o convalidare un prefisso, tuttavia recentemente mi sono reso conto che sto anche convalidando input come campi di testo biologico, commenti degli utenti, ecc. per i quali l'input non ha una sintassi solida.

Il vantaggio principale è sempre sembrato essere: La convalida dei caratteri consentiti riduce il rischio di perdere un personaggio potenzialmente dannoso, ma aumenta il rischio che tu non permetta un personaggio che l'utente potrebbe voler utilizzare. Il primo è più importante.

Tuttavia, se sto impedendo correttamente l'iniezione di SQL (con istruzioni preparate) e anche l'output di escape, c'è bisogno di questa ulteriore barriera di protezione? Mi sembra che stia semplicemente autorizzando praticamente tutti i caratteri sulla tastiera e mi sto dimenticando di consentire alcuni caratteri comuni.

Esiste una pratica accettata per questa situazione? O mi manca qualcosa di ovvio?

Grazie.

    
posta Tom 04.04.2012 - 13:06
fonte

3 risposte

8

Qualsiasi implementazione che cerchi di rilevare "caratteri dannosi" è difettosa, quando si esaminano le proprietà combinate di tale implementazione:

  • Un sottoinsieme "valido" di un set di caratteri non è così facile da definire. Newline è un personaggio di controllo , e lo si vuole assolutamente permettere nei commenti. Dovresti lavorare per giorni o settimane per creare un sottoinsieme sensibile di Unicode (e combinazioni di caratteri) che possa essere considerato "valido" in tutto il mondo.
  • Un sottoinsieme "non valido" è anche difficile, se stai facendo qualcosa anche lontanamente complesso. Ad esempio, non vuoi le virgolette letterali in SQL, ma non vuoi letterali e commerciali o segni di disuguaglianza in HTML o backslash in JavaScript. Se disponi di una serie di lingue di input e output, l'unico modo per essere sicuri è escape input / output utente per ognuno e test che l'escape funziona.
  • Il set è valido solo per una singola versione di un singolo set di caratteri , quindi non è a prova di futuro.
  • Devi ancora testare l'intero intervallo di caratteri per vedere se ci sono dei buchi di sicurezza.
  • Se non fai attenzione a ciò che accetti, finirai con gli utenti fastidiosi e se ne andranno. Se sei fortunato, uno su mille presenterà una segnalazione di bug.

Direi che convalidare i caratteri consentiti riduce la sicurezza, perché incoraggia un'implementazione sciatta (mancanza di test / escape). Se fuggi dove necessario, puoi semplicemente testare i personaggi "cattivi", e se funzionano, hai praticamente garantito che anche altri personaggi cattivi saranno inoffensivi per il sistema.

Tutto questo ovviamente non significa che alcuni caratteri siano nonsensical in alcuni campi, come two in un campo numerico. Ma anche questo spesso non è banale:

  • Diverse lingue hanno diversi decimali e migliaia di separatori. 1,000 == 1 in gran parte dell'Europa e 1'000 è un modo valido per scrivere 1000 in alcuni punti. Non vuoi dire a quegli utenti che il loro modo di scrivere è sbagliato.
  • Gli zeri iniziali, i segni più, l'hash e l'asterisco sono tutti caratteri validi in un numero di telefono. Alcuni paesi includono un prefisso interno ( (0) in Svizzera) che tu hai da utilizzare all'interno del Paese e hai da escludere quando utilizzi un codice lingua.
  • Contrariamente a molti sviluppatori di web sciatti, gli indirizzi email possono contenere caratteri tratteggiati e più, e un sacco di altri che vengono regolarmente respinti come se volessero dimostrare che la politica aziendale è che farebbero bene se non fosse per tutti quei fastidiosi clienti.
  • I nomi possono contenere virgolette ( Gerard 't Hooft ), numeri ( John Doe the 5th ), punteggiatura ( John Doe, M.D. ) e SQL:
risposta data 04.04.2012 - 13:36
fonte
0

Per me dipende da quale sia la condizione.

Se solo alcuni caratteri sono validi (password (dubbiosa?), numeri di telefono, nomi di host, indirizzi IP), allora dovresti controllare che ogni carattere sia valido.

Se tuttavia qualcosa è valido, ma i caratteri speciali sono problemi (nomi di file, sql, html), allora dovresti controllarli esplicitamente.

    
risposta data 04.04.2012 - 13:23
fonte
-1

Di solito il set di caratteri non consentiti è piccolo, quindi cercare nel flusso di input è più sensato. Per quelle volte in cui è invertito, consentendo solo a pochi e disabilitando molti, di solito è meglio abbinarli ai personaggi accettati. Non esiste una regola universale. Devi comprendere appieno quale sia la tua gamma di caratteri consentiti.

Chiedi se ti manca qualcosa di ovvio. Quello che ti manca è la prospettiva dei tuoi utenti. Ti stai avvicinando all'esigenza di convalida da un punto di vista tecnico, ma la maggior parte della convalida riguarda esclusivamente l'utente.

Chiedere se è importante è facile come chiedere se migliora l'esperienza dell'utente. Se lo fa, dovresti sostenerlo. Se non lo fa, non farlo. La frustrazione degli utenti è alta quando entrano in un personaggio solo per essere raccontati su una schermata separata o finestra popup o un messaggio di errore "mi dispiace, non puoi inserire un" - "nel tuo numero di telefono". La frustrazione può essere altrettanto elevata se sanno che un "-" è legale ma il tuo software lo esclude.

La cosa più importante, tuttavia, è essere assolutamente certi che i caratteri che non sono realmente necessari per disabilitare . Ad esempio, nulla mi infastidisce più di un sito web che mi dà un errore quando inserisco trattini in un numero di telefono o numero di previdenza sociale, o spazi nel numero di una carta di credito. I computer sono abbastanza intelligenti da rimuoverli semplicemente. Non costringermi a inserire una stringa che corrisponda ai tuoi requisiti interni quando puoi facilmente accettare di più e semplicemente ignorare i caratteri che qualsiasi umano ragionevole potrebbe ignorare.

    
risposta data 04.04.2012 - 13:22
fonte

Leggi altre domande sui tag