En este caso específico, si reemplazo \
con \
y "
con \"
, ¿es posible engañar a mi filtro?
Eso no es suficiente, su filtro es inseguro.
Por ejemplo, un vector de ataque XSS válido sería </script><svg onload=alert(1)>
, terminando con:
<script>
var test = {src: "test", layer: {"input": "</script><svg onload=alert(1)>", "event": "ready"}};
</script>
Dado que el árbol XML (HTML) se analiza antes de evaluar cualquier JS, la etiqueta de script de cierre ( </script>
) terminará el script a pesar de estar dentro de una cadena JS.
Otro problema con su filtro son los saltos de línea. Si un atacante puede insertar un byte 0x0a
, puede romper su secuencia de comandos causando un error de sintaxis (ya que una cadena entre comillas dobles no puede abarcar varias líneas):
<script>
var test = {src: "test", layer: {"input": "
", "event": "ready"}};
</script>
Si está utilizando PHP, una función de filtro conveniente para trabajar de manera segura con la entrada del usuario dentro de JS es json_encode()
. De esta respuesta :
Con PHP simple, un enfoque común y seguro es utilizar
json_encode()
como se explica aquí . Por ejemplo:
var foo = <?php echo json_encode($foo, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>
json_encode()
devuelve la representación JSON de un valor, por lo tanto, es
garantizado para evaluar un objeto válido en su código JS y puede
simplemente asignarlo a una variable como se muestra. Pero no omita el adicional
banderas. Dependiendo del contexto, un atacante podría utilizar
cargas útiles como </script>
para romper la etiqueta completa del script.