Questo è sicuro sotto due presupposti:
- I browser seguono effettivamente le specifiche
- inserisci solo dati non attendibili tra i tag.
Per quanto riguarda il # 1, ho provato le versioni recenti di IE, Chrome e Firefox e sembra che tutti lo seguano. Ma nel passato i browser erano creature molto permissive, quindi potrebbero essercene di vecchi in giro che presumerebbero gentilmente che tu voglia dire <script>
e non < script>
.
Per quanto riguarda il n. 2, è importante ricordare che l'XSS dipende dal contesto. Supponendo che cleaned()
sia un'implementazione del tuo schema, quanto segue sarebbe sicuro:
<div><?= cleaned(userdata); ?></div> <!-- Between tags. -->
Ma ad es. il seguente non sarebbe sicuro:
<input value="<?= cleaned(userdata); ?>"> <!-- Inside attribute. -->
<script> let x = "<?= cleaned(userdata); ?>"; </script> <!-- Inside script. -->
<style> a { color: <?= cleaned(userdata); ?>; } </style> <!-- Inside style. -->
Come sempre, raccomando il foglio cheat di prevenzione OWASP XSS .
Modifica: dici no lettere . Come per questa risposta probabilmente non vuoi consentire <!
, </
o <?
, dal momento che potrebbero essere utilizzati per avviare commenti e chiudere tag. Potrebbe non portare a XSS, ma potrebbe comunque rovinare la tua pagina con conseguenze inaspettate.