En WebKit obtengo el siguiente error en mi JavaScript:
Se negó a ejecutar un script de JavaScript. El código fuente del script que se encuentra dentro de la solicitud.
El código es para un spinner de JavaScript, ver ASCII Art .
El código solía funcionar bien y todavía funciona correctamente en Camino y Firefox. El error solo parece aparecer cuando la página se guarda a través de un POST y luego se recupera mediante un GET. Sucede tanto en Chrome / Mac como en Safari / Mac.
Alguien sabe lo que esto significa y cómo solucionarlo?
javascript
code-injection
doekman
fuente
fuente
Respuestas:
Es una medida de seguridad para prevenir ataques XSS (cross-site scripting) .
Esto sucede cuando se envía algún código JavaScript al servidor a través de una solicitud HTTP POST, y el mismo código vuelve a través de la respuesta HTTP. Si Chrome detecta esta situación, se niega la ejecución del script y aparece el mensaje de error
Refused to execute a JavaScript script. Source code of script found within request
.Consulte también esta entrada de blog sobre Seguridad en profundidad: nuevas funciones de seguridad .
fuente
Esta "función" se puede desactivar enviando el encabezado HTTP no estándar
X-XSS-Protection
en la página afectada.X-XSS-Protection: 0
fuente
Respuesta corta : actualice la página después de realizar el envío inicial del javascript, o presione la URL que mostrará la página que está editando.
Respuesta larga : debido a que el texto que completó en el formulario incluye javascript, y el navegador no necesariamente sabe que usted es el origen del javascript, es más seguro para el navegador asumir que usted no es el origen de este JS, y no ejecutarlo.
Un ejemplo : supongamos que le di un enlace a su correo electrónico o facebook con algo de javascript. E imagina que el javascript enviaría un mensaje a todos tus amigos con mi enlace genial. Entonces, el juego de hacer que ese enlace sea invocado se convierte en simplemente, encontrar un lugar para enviar el javascript de manera que se incluya en la página.
Chrome y otros navegadores WebKit intentan mitigar este riesgo al no ejecutar ningún javascript que se encuentre en la respuesta, si estuviera presente en la solicitud. Mi infame ataque se vería frustrado porque su navegador nunca ejecutaría ese JS.
En su caso, lo está enviando a un campo de formulario. El campo Publicar del formulario provocará una representación de la página que mostrará el Javascript, lo que hará que el navegador se preocupe. Sin embargo, si su javascript está realmente guardado, ingresar a esa misma página sin enviar el formulario permitirá que se ejecute.
fuente
Como han dicho otros, esto sucede cuando una respuesta HTTP contiene una cadena de JavaScript y / o HTML que también estaba en la solicitud. Esto generalmente se debe a la introducción de JS o HTML en un campo de formulario, pero también se puede activar de otras formas, como ajustar manualmente los parámetros de la URL.
El problema con esto es que alguien con malas intenciones podría poner cualquier JS que quiera como valor, enlazar a esa URL con el valor JS malicioso y causar problemas a sus usuarios.
En casi todos los casos, esto se puede solucionar mediante la codificación HTML de la respuesta , aunque hay excepciones. Por ejemplo, esto no será seguro para el contenido dentro de una
<script>
etiqueta. Otros casos específicos se pueden manejar de manera diferente; por ejemplo, la codificación de URL sirve mejor para inyectar entradas en una URL.Como mencionó Kendall Hopkins, puede haber algunos casos en los que realmente desee que se ejecute JavaScript de las entradas del formulario, como crear una aplicación como JSFiddle . En esos casos, le recomendaría que al menos revise la entrada en su código de backend antes de escribirlo a ciegas. Después de eso, puede usar el método que mencionó para evitar el bloqueo de XSS (al menos en Chrome), pero tenga en cuenta que lo está abriendo a los atacantes.
fuente
Utilicé este truco de PHP hacky justo después de comprometerme con la base de datos, pero antes de que el script se procese desde mi
_GET
solicitud:if(!empty($_POST['contains_script'])) { echo "<script>document.location='template.php';</script>"; }
Esta fue la solución más barata para mí.
fuente