Validazione degli input: come si fa se devo accettare l'HTML come parte del mio input?

5

Sto scrivendo un servizio che riceve dati FHIR e lo memorizza. FHIR è un formato standard di informazioni sanitarie HL7 che contiene HTML per definizione, incorporato in un JSON o XML, ( per garantire la leggibilità umana del documento )

Come devo eseguire la convalida dell'input in questo caso, per essere ancora in grado di evitare XSS e altri attacchi simili?

    
posta Gabor Herman 31.08.2015 - 16:36
fonte

3 risposte

2

Per definizione, FHIR ti chiede di preservare la vulnerabilità XSS dei dati (memorizza come codice, mostra come codice). XSS richiede che i dati vengano visualizzati agli utenti, cosa che potrebbe essere prevenuta con la convalida dell'output. Accetta l'input, memorizza come JSON, filtra quando visualizza i dati HTML come codice HTML. A seconda dei sistemi "output", questo potrebbe essere molto più semplice (dipende dalle necessità del sistema).

Filtrare specificamente codice errato (javascript dannoso, collegamenti ecc.) sarà molto difficile. Ci sono molti modi per nascondere il codice errato attraverso l'offuscamento.

Quello che potresti fare, a seconda dei dettagli delle specifiche FHIR, è di autorizzare un codice buono / accettabile. Se la specifica FHIR è strettamente definita, la whitelisting dovrebbe essere facile da eseguire. Se la specifica non è strettamente definita, potrebbe essere impossibile bloccare tutti i tentativi di archiviazione XSS.

    
risposta data 31.08.2015 - 17:14
fonte
2

Sono dell'opinione che dovresti filtrare (bloccare) l'input xss E sfuggire l'input fornito dall'utente sull'output. Perché? Poiché i database sono longevi e spesso condivisi, quindi non dovrebbero contenere xss. E le applicazioni web spesso utilizzano più di una fonte di dati.

Se stai utilizzando Java, puoi utilizzare Hibernate Validator con JSoup per analizzare e convalidare l'input HTML.

Ha un WhiteListType , che ti consente di selezionare quali tag consentire. WhiteListType.NONE non accetta tag HTML, WhiteListType.SIMPLE_TEXT accetta b , em , i , strong , u .

Puoi sempre creare la tua lista bianca.

    
risposta data 31.08.2015 - 20:52
fonte
2

La soluzione migliore è probabilmente non eseguire la convalida dell'input, ma eseguire una sanificazione dell'output.

È possibile utilizzare un igienizzatore come Google Caja per rimuovere lo script prima che venga emesso nella pagina HTML .

Poiché spesso nei disinfettanti sono presenti errori, spesso quando c'è una nuova aggiunta o modifica alle specifiche HTML o all'implementazione in un browser, si consiglia di combinare questo con uno sviluppatore Norme sulla sicurezza dei contenuti . Si tratta di una funzionalità HTML5 che può impedire gli attacchi XSS nei browser supportati, in quanto è autorizzata la whitelist di quali script possono essere eseguiti. Qualsiasi inietto da un utente fallirà con un errore nella console del browser.

La ragione per cui raccomando di disinfettare sull'output piuttosto che sull'input è perché se nel tuo database c'erano già degli input precedenti che ignorano la versione dell'igienizzatore usato in quel momento, questo può spesso essere risolto facilmente in seguito aggiornando l'igienizzatore usato per l'ultima versione. Se si sterilizza all'input, ciò diventa più difficile in quanto è necessario eseguire tutti gli input utente esistenti attraverso l'igienizzatore ogni volta che lo si aggiorna.

    
risposta data 02.09.2015 - 11:14
fonte

Leggi altre domande sui tag