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;
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.)Dobbiamo permettere personaggi come
<
,"
,>
perché si può decidere di fare un po 'lo stile di base usando l'editor WYSIWYG, in modohtmlspecialchars()
non è un'opzione, mentre l'eco/sanificazione dei valori, perché cose dannose come l'interruzione di<br>
.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.
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
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 –