Während die Datenvalidierung bei der Vermeidung von XSS sehr hilfreich sein kann, deckt sie nicht unbedingt alle Grundlagen für persistente XSS ab. Der einzige 100% effektive Schutz ist die korrekte kontextabhängige Ausgabecodierung, wie sie vom OWASP Java Encoder Project oder OWASP ESAPIs Encoder angeboten wird. Ein Grund dafür ist persistentes XSS, die verdorbenen Daten können von einer DB stammen, die von einer anderen Anwendung eingegeben oder geändert werden kann, die Einfüge-/Aktualisierungszugriff auf dieselben DB-Tabellen hat, die jedoch keine korrekte Datenvalidierung durchführt. (Das heißt, die verdorbenen Daten könnten auf andere Weise in Ihr System gelangen als über Ihre Anwendung.) Die einzige narrensichere Lösung besteht also darin, eine korrekte kontextabhängige Ausgabecodierung vorzunehmen. Der OWASP XSS Prevention Cheat Sheet, auf den du bereits hingewiesen wurdest, ist ein großartiger Ausgangspunkt, der all das erklärt.
Ich würde beginnen, indem Regel # 0 und Regel # 1 unter: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet – fgb