Esto es seguro bajo dos suposiciones:
- Los navegadores realmente siguen la especificación.
- Solo inserta datos no confiables entre etiquetas.
En cuanto al # 1, probé versiones recientes de IE, Chrome y Firefox y todas parecen seguirlo. Pero en el pasado, los navegadores eran criaturas muy tolerantes, por lo que podría haber algunos antiguos que amablemente asuman que te refieres a <script>
y no a < script>
.
En cuanto al # 2, es importante recordar que XSS depende del contexto. Suponiendo que cleaned()
es una implementación de su esquema, lo siguiente sería seguro:
<div><?= cleaned(userdata); ?></div> <!-- Between tags. -->
Pero por ejemplo lo siguiente no sería seguro:
<input value="<?= cleaned(userdata); ?>"> <!-- Inside attribute. -->
<script> let x = "<?= cleaned(userdata); ?>"; </script> <!-- Inside script. -->
<style> a { color: <?= cleaned(userdata); ?>; } </style> <!-- Inside style. -->
Como siempre, recomiendo el Chuleta de prevención OWASP XSS .
Editar: Dices que no hay letras . Según esta respuesta probablemente no quiera permitir <!
, </
o <?
tampoco , ya que podrían utilizarse para iniciar comentarios y cerrar etiquetas. Podría no llevar a XSS, pero aún podría arruinar tu página con consecuencias inesperadas.