Una técnica para evitar el filtrado de palabras comunes es la que describí en el título.
Sin embargo, ¿por qué funciona esta técnica? SELECT no es lo mismo que SELSELECTECT, por ejemplo.
Digamos que puse en la lista negra la palabra <script>
y la reemplacé con nada. Entonces, <scr<script>ipt>
se convierte en <script>
.
Es por esto que los desinfectantes / purificadores html bien escritos aplican las reglas de forma recursiva. Solo cuando el último paso de saneamiento no hizo cambios en el contenido, se detendrá / no aplicará otra ronda de las reglas de procesamiento. (También es probable que falle y no devuelva contenido si se requieren demasiadas rondas de procesamiento).
Esto funciona contra los desinfectantes rotos que simplemente usan s.Replace("select","")
. Cuando lo aplicas a selselectect
, elimina el select
en el medio, pero como no se ejecuta nuevamente en la salida, la división sel
+ ect
se convierte en select
y sobrevive al desinfectante.
Este ataque no funcionará contra ningún desinfectante sano.
Lea otras preguntas en las etiquetas web-application attack-prevention