Estoy usando Google Chrome versión 98 para esto.
He notado que cuando tengo un window.prompt e ingreso <script> , devuelve una cadena con el valor de \x3Cscript> en lugar de <script> . Esto es extraño para mí porque si solo ingreso < , entonces devuelve < . Solo cuando ingreso <script> cambia el primer paréntesis angular a su código hexadecimal; ingresar <a> devuelve <a> , incluso ingresar <scrip devuelve <scrip . Lo que estoy preguntando es, ¿el motor Javascript dentro de un navegador hace este análisis interno para evitar inyectar Javascript? ¿Cómo funciona internamente la función window.prompt ? Intenté buscar cómo funciona window.prompt y no pude encontrar nada relacionado con esto.
EDITAR: hago esta pregunta porque originalmente estaba probando escribir una cookie en función de la entrada del usuario y luego hacer un saludo en función del valor de la cookie. Aquí está el código:
const header = document.getElementById('survey-header'); if (document.cookie.split(';').some(item => item.trim().startsWith('name='))) { name = document.cookie .split('; ') .find(row => row.startsWith('name=')) .split('=')[1]; } else { name = window.prompt('Please enter your name', 'User'); document.cookie = 'name=' + name } /* Set header to greeting message */ header.textContent = 'Greetings, ' + name Pero noté que cuando trato de inyectar Javascript en el mensaje, el encabezado se muestra como Greetings, \x3Cscript>...</script> . Eso me hizo sentir curiosidad por qué solo se muestran algunos corchetes angulares como su código hexadecimal.
Existen algunas diferencias entre la ejecución normal de un script y la "consola de Chrome"/REPL. Los scripts regulares son ejecutados por un motor de JavaScript que se ajusta a la especificación de JavaScript (EcmaScript), por lo que la forma en que se comportan los diferentes motores de JavaScript está estandarizada. La consola Chrome, por otro lado, es libre de tener algunas peculiaridades y reglas especiales que implementa que no necesariamente siguen las especificaciones de JavaScript. Como resultado, encontrará que algunas cosas se comportan de manera ligeramente diferente en la consola de Chrome en comparación con cómo se comportarían en una secuencia de comandos estándar (vea aquí otro ejemplo).
En su caso, el comportamiento que está viendo es específico de la consola de Chrome y no es algo que se haga porque esté especificado en la especificación de JavaScript. En cambio, la función proviene de una decisión de diseño tomada por el equipo de herramientas de desarrollo de Chrome. El resultado que ve es una versión escapada de la cadena "<script>" , que se realiza para permitir a los usuarios copiar de forma segura los resultados de la consola de Chrome en su propio código HTML. Esto se describe como parte de los objetivos de diseño de cómo la consola de Chrome muestra las cadenas:
objetivos de diseño
Queremos mejorar la legibilidad de las cadenas mostradas, sin dejar de generar literales de JavaScript válidos. Para garantizar la seguridad de nuestros usuarios, debemos escapar "<!--", "<script" y "</script" de modo que la cadena resultante se pueda copiar de forma segura en etiquetas dentro de HTML.
(su énfasis)
Si tiene curiosidad, puede ver cómo se implementa aquí .
Debido a que este comportamiento es específico de la consola de Chrome, los motores de JavaScript regulares no desinfectarán las entradas de los usuarios; aún depende de usted usar los métodos DOM apropiados (como .innerText , .textContent , etc.) y los métodos de desinfección de cadenas para administrar y mostrar sus entradas de usuario de forma segura. Si ingresa <script>alert(1);</script> en la entrada a continuación, encontrará que su cadena no se escapa y aún puede causar problemas de seguridad:
const userInput = prompt("Enter XSS code:"); document.write(userInput);