2013-06-26 12 views
6

Ho un'applicazione di livello aziendale in cui gli utenti registrati sono autorizzati a pubblicare articoli sulla pagina utilizzando un editor WYSIWYG. (Puoi considerare questa applicazione come un costruttore di siti web.)Come posso consentire gli editor WYSIWYG e disabilitare gli attacchi XSS usando Laravel?

Tutto funziona, ma i problemi sono;

  1. editor WYSIWYG messaggi HTML contenente un articolo, caratteri della stringa anche qualche localizzato che laravel non gli piace, così assegno laravel alpha_num non può passare. (Quindi non usiamo su controlli di convalida.)

  2. Dobbiamo permettere personaggi come <, ", > perché si può decidere di fare un po 'lo stile di base usando l'editor WYSIWYG, in modo htmlspecialchars() non è un'opzione, mentre l'eco/sanificazione dei valori, perché cose dannose come l'interruzione di <br>.

  3. Gli utenti sono in grado di postare cose come, <script type="text/javascript>alert('Hello');</script> o </div></div></div><div style="width: 100%, height: 100% z-index: 999999"> È un enorme rischio per la sicurezza, lo so, ma non possiamo davvero sanitizzare/sfuggire nulla. Gli utenti saranno comunque in grado di scrivere <s<!---->cript> e passare il controllo.

Quindi, in breve, non possiamo contare su alcune funzioni integrate di Laravel e PHP. Non è possibile disabilitare anche l'editor WYSIWYG, poiché viene utilizzato spesso nella maggior parte delle aree dell'applicazione parlata.

Qual è il modo migliore per evitare questo?

Sto pensando di creare una regola personalizzata in cima a alpha_num su Laravel, che verrebbe chiamata come qualcosa come alpha_num_localised_characters_plus_allowed_html_tags e aggiungere tale regola a qualsiasi input contenente l'editor WYSIWYG.

È un buon modo? C'è un'alternativa migliore? Come gestisci te stesso tali questioni?

Nota: si noti che abbiamo già sviluppato un'applicazione di grandi dimensioni, faremo affidamento sulla soluzione più rapida e più manutenibile.

+0

Voglio fare una piccola aggiunta. Al momento passiamo qualsiasi input non convalidato da Laravel (ad esempio email | alpha | alpha_dash | custom_validations) per essere convalidato da HTMLPurifier :: purify(). Fammi sapere se c'è un modo più veloce! – Aristona

+0

Non mi "validare" usando htmlpurifier - piuttosto lo uso solo per assicurarmi che l'input sia "sicuro". L'unica validazione che vorrei fare con laravel è "richiesta" se il campo è richiesto. - guarda la mia risposta per ulteriori dettagli –

risposta

2

È possibile utilizzare un sistema di tag simile al BBCode o Markdown per consentire agli utenti di eseguire determinate operazioni. In questo modo, puoi essere sicuro che l'input sarà sterilizzato contro OGNI tipo di script dannoso, basta usare un lexer e una protezione XSS durante la visualizzazione del contenuto dell'utente.

EDIT: Per capire cosa intendo, è possibile utilizzare CKEditor come editor WYSIWYG, in collaborazione con il BBCode plugin:

+0

Ok, questo è fantastico. Un editor che pubblica un BBCode e fornisce anche WYSIWYG contemporaneamente? Diavolo si Molte grazie. Lo includerò nei miei progetti d'ora in poi! Questa soluzione è ciò che stavo cercando. – Aristona

-1

Non so quanto sia fattibile per voi, ma una soluzione semplice e veloce è utilizzare i cookie httpSuonamente. Risolve gli attacchi XSS tramite l'iniezione di javascript dannosi in quanto quei cookie non sono accessibili a javascript. Puoi provare a mettere dati sensibili nei cookie di httpOnly e non così sensibili nei normali cookie. Vedere questo: http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html

+0

Non mi interessa i cookie. Javascript deve essere completamente disabilitato comunque. – Aristona

1

È possibile eseguire tutto tramite strip_tags e consentire solo i tag minimi possibili?

Si potrebbe anche voler guardare html purifier che dovrebbe dare più opzioni tra cui il controllo su CSS

Cosa faccio di solito è salvare due copie del contenuto WYSIWYG:

  1. il contenuto non filtrato originale
  2. il contenuto filtrato

Questo mi permette di rielaborare i contenuti originali se trovo qualcosa che vi tal è stato rimosso e mostra all'utente il suo html originale durante la modifica.Ovviamente visualizzo il contenuto filtrato ovunque sia visualizzato sul sito.

0

utilizzando laravel si potrebbe anche avere per disinfettare per le cose di modello della lama. Non vuoi che gli utenti inseriscano contenuti come: {{{phpInfo()}}}.

La creazione di un editor WYSIWYG richiede che gli utenti abbiano un certo livello di affidabilità. Se non ti fidi degli utenti l'opzione migliore è ciò che viene menzionato in precedenza utilizzando tag personalizzati.