Dovremmo delegare la disinfezione / validazione dell'input dell'utente?

-2

Considera questo codice:

new FrameworkClass( [ 'query' => $_POST[ 'input' ] ] );

FrameworkClass dovrebbe eseguire la disinfezione e la convalida dell'input. Dovremmo semplicemente fidarci del codice di terze parti per fare il suo lavoro?

La mia argomentazione sarebbe che preferirei avere i miei dati di input disinfettati / convalidati due volte più che fidarsi di una libreria esterna.

Se dovessimo semplicemente fidarci di FrameworkClass , potremmo anche omettere i dati di escape prima dell'output se proviene da una "fonte attendibile".

    
posta Michael 26.09.2018 - 15:39
fonte

1 risposta

2

Se i dati sono "sicuri" o meno dipende da come vengono utilizzati i dati. Pertanto, non può esistere alcun quadro che risulti magicamente disinfettato dai dati. Invece:

  1. determina come verranno utilizzati i dati.
  2. per ogni utilizzo, determina se i dati devono essere elaborati per sicurezza
  3. implementare tali misure di sicurezza

Esempio, dove i dati sono messaggi di testo in chiaro:

  • Utilizzo: il messaggio viene visualizzato come parte di una pagina HTML.
    Requisito di sicurezza: i caratteri speciali HTML devono essere sottoposti a escape per evitare XSS.
    Soluzione: utilizza la funzione di escape esistente del tuo motore di template.

  • Utilizzo: il messaggio è archiviato in un database SQL.
    Requisito di sicurezza: il contenuto del messaggio non deve essere interpolato verbatim in un'istruzione SQL.
    Soluzione: eseguire un'istruzione preparata con il contenuto del messaggio come parametro.

  • Utilizzo: il messaggio viene visualizzato in un sistema di chat pubblico.
    Requisito: il messaggio non deve contenere un linguaggio offensivo.
    Soluzione: rifiuta i messaggi quando includono parole di parolacce ovvie.

In questo esempio, gli stessi dati vengono utilizzati in diversi contesti che non possono essere corretti in qualche modo disinfettando l'input per primi: hanno requisiti completamente diversi.

Ogni volta che viene tentata una tale sanificazione, di solito è inefficace (ad esempio aggiungendo barre rovesciate prima di alcuni caratteri), o addirittura distruttiva (ad esempio eliminando caratteri "pericolosi"). Una volta ho usato un sistema di messaggistica che eliminava caratteri speciali come dieresi o la maggior parte dei segni di punteggiatura, rendendo i messaggi incomprensibili.

Tuttavia, quando si implementano misure di sicurezza adeguate (che possono includere passaggi come la rimozione di contenuto o la visualizzazione di contenuto), utilizzare le implementazioni esistenti è una buona idea. Probabilmente il framework è testato meglio del codice che avresti scritto. Ti farà risparmiare tempo. Ad esempio, "linguaggio offensivo" è davvero difficile da determinare. Potrebbe essere preferibile utilizzare alcune librerie esistenti con varie euristiche, o almeno iniziare con un elenco di parolacce pubblicamente disponibili.

In ogni caso, la chiave è non gettare una soluzione esistente al tuo problema per vedere se "funziona", ma per iniziare con il tuo problema reale e quindi elaborare una soluzione - dove quella soluzione potrebbe già essere parte della tua struttura .

    
risposta data 26.09.2018 - 16:52
fonte

Leggi altre domande sui tag