2010-05-24 14 views
6

Sto elaborando un input da parte del pubblico con un editor WYSIWYG javascript e sto pensando di utilizzare htmlpurifier per ripulire il testo.utilizzando htmlpurifier per l'input o l'output di escape/filtering

Ho pensato che sarebbe stato sufficiente utilizzare htmlpurifier sull'input, archiviato l'input pulito nel database e quindi inviarlo senza ulteriori fughe/filtri. Ma ho sentito altre opinioni che dovresti sempre sfuggire all'output.

Qualcuno può spiegare perché avrei bisogno di pulire l'output se sto già pulendo l'input?

risposta

4

Presumo che l'editor WYSIWYG generi HTML, che viene quindi convalidato e inserito nel database. In quel caso, la convalida ha già avuto luogo, quindi non è necessario convalidare due volte.

Per quanto riguarda "l'output di escape", è diverso. Non puoi sfuggire al codice HTML risultante, altrimenti non avrai testo formattato e i tag saranno visibili. L'escape dell'output viene utilizzato quando non si desidera che detto output interferisca con il markup della pagina.

Vorrei aggiungere che devi essere molto attento a ciò che permetti nella fase di validazione. Probabilmente vorrai solo consentire alcuni tag e attributi HTML.

+0

Il problema di affidarsi all'editor di js è che un utente malintenzionato potrebbe inviare un post ignorando qualsiasi controllo di js. – Yehosef

+0

@user, naturalmente. Ma non è il tuo depuratore per questo scopo? –

+0

@Col - sì - ma Artefacto stava dicendo che il js "convalidava" l'html - quindi non c'è bisogno di convalidare due volte (che significa usare htmlpurifier) ​​ – Yehosef

1

Il mantra sfugge sempre all'output, che è una conversione da testo a HTML, è una buona e ragionevole impostazione predefinita per tornare a quando si lavora nello spazio web. Nel caso di HTML Purifier, stai specificamente rompendo questo buon consiglio, perché stai effettivamente eseguendo una conversione da HTML a HTML e trattando l'HTML come Testo di nuovo non ha molto senso.

+0

grazie per la risposta ma non l'ho seguito abbastanza - stai dicendo che una volta utilizzando htmlpurifier, potrebbe essere trattato come sicuro? – Yehosef

+1

Penso che dipenda dal contesto. Se consenti agli utenti di scrivere un post sul blog, si utilizza HTMLPurifier per decidere quali tag possono essere utilizzati. Una volta fatto, hai bisogno dell'output HTML come HTML. Non si desidera trattarlo come testo che esegue l'escape, altrimenti se l'utente ha messo in grassetto una parola, sarebbe stato sfuggito e visualizzato come word. Forse Edward tornerà per confermare il mio commento. – joedevon

2

Per essere sicuro al 100%, utilizzare HTMLPurifier due volte. Prima di salvare l'HTML in DB e prima di emetterlo sullo schermo.
L'enorme inconveniente di tale soluzione è la prestazione. HTMLPurifier è ultraslow durante il filtraggio di HTML e potresti riscontrare tempi di elaborazione più lunghi delle tue pagine.

Si dovrebbe essere ok se si eseguono solo 1-2 filtri prima di inviare qualcosa sullo schermo, ma se si eseguono 10 filtri per richiesta come abbiamo fatto, abbiamo deciso di non utilizzare HTMLPurifier durante l'output di grandi quantità di testi da conservare.

HTMLPurifier ha richiesto il 60% del tempo di elaborazione per richiesta e abbiamo voluto ottenere tempi di risposta bassi e UX superiore.

Dipende dalla situazione. Se puoi permetterti di usare HTMLPurifier prima dell'output, provalo - è meglio e hai sempre il controllo su quali tag vuoi consentire (per i contenuti nuovi e anche per quelli vecchi memorizzati nel tuo db).

+1

Grazie per il tuo post - ma puoi spiegare un caso in cui avrei dovuto farlo due volte? ad es. Se lo faccio: $ id = (int) $ _ POST ['id']; $ db-> query ("seleziona * dagli utenti dove id =" .int_val ($ id)); ho guadagnato qualcosa in sicurezza? – Yehosef

+1

Il secondo filtro (prima dell'output) è utile nei casi in cui qualcuno ha violato il server db ma non è riuscito a penetrare nel server web. L'utente malintenzionato può facilmente modificare qualsiasi contenuto nel tuo db e, se non stai filtrando l'HTML prima di emettere l'output, hai un serio problema di sicurezza. Comunque credo che questo sia uno scenario molto raro. –

+1

questo è lo scenario ridiculuos, direi –

Problemi correlati