2009-10-10 6 views
79

En WebKit me sale el siguiente error en mi JavaScript:Se negó a ejecutar un script de JavaScript. El código fuente de la secuencia de comandos encuentra dentro solicitud

negó a ejecutar un script JavaScript. Código fuente de script encontrado dentro de la solicitud.

El código es para un hilandero de JavaScript, vea ASCII Art.

El código solía funcionar correctamente y todavía funciona correctamente en Camino y Firefox. El error solo parece ser arrojado cuando la página se guarda a través de un POST y luego se recupera a través de un GET. Sucede tanto en Chrome/Mac como en Safari/Mac.

¿Alguien sabe lo que significa esto y cómo solucionarlo?

+0

Hmm, probablemente mi WebKit ha sido actualizado. La página funciona de nuevo. También todas las revisiones antiguas de la página (vea el botón Old Revisions en la parte inferior de la página). – doekman

+0

este error se produce en el editor tryit de w3schools http://www.w3schools.com/js/tryit.asp?filename=tryjs_events, el script se ejecuta la primera vez, pero se bloquea desde el momento en que hace clic en "editar y haga clic en "botón". –

+1

Si presiona el botón "editar y hacer clic en mí", el contenido del área de texto (con el javascript) se envía al servidor a través de un POST. Chrome detecta que javascript está publicado en el servidor y podría ser malicioso. El bloqueo es la medida contra los ataques XSS. – doekman

Respuesta

65

Es una medida de seguridad para prevenir ataques XSS (cross-site scripting).

Esto ocurre cuando se envía un 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.

Ver también esta publicación sobre Security in Depth: New Security Features.

+5

Sería bueno para ver algún tipo de referencia. – kangax

+0

pero ¿esto causa problemas? ¿Está bien si ignoramos este mensaje? – samach

+0

@Greg ¿Qué algoritmo utilizan los navegadores para "detectar la situación"? No se puede simplemente buscar la cadena "

129

Esta "característica" se puede deshabilitar enviando el encabezado HTTP no estándar X-XSS-Protection en la página afectada.

X-XSS-Protection: 0 
+8

¡Gracias! Esto merece muchos más votos favorables. –

+0

Esto no funcionó para mí. –

+2

Asegúrese de que la página que desencadena este error se envíe con este encabezado, no enviando la página. –

14

Respuesta corta: actualizar la página después de hacer su presentación inicial del Javascript, o golpear el URL que se mostrará la página que está editando.

Respuesta larga: como el texto que completa 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 suponer que usted no es el fuente de este JS, y no ejecutarlo.

Un ejemplo: Supongamos que le di un enlace a su correo electrónico o Facebook con algunos javascript en él. E imagina que el javascript enviaría un mensaje a todos tus amigos con mi genial enlace. Por lo tanto, el juego de hacer que se invoque ese enlace se convierte simplemente en encontrar un lugar para enviar el javascript de modo que se incluya en la página.

Chrome y otros navegadores WebKit intentan mitigar este riesgo al no ejecutar ningún javascript que esté en la respuesta, si estaba presente en la solicitud. Mi nefasto ataque se vería frustrado porque tu navegador nunca ejecutaría ese JS.

En su caso, lo está enviando a un campo de formulario. La publicación del campo de formulario generará una imagen de la página que mostrará el código JavaScript, lo que hará que el navegador se preocupe. Sin embargo, si su javascript está verdaderamente guardado, al presionar esa misma página sin enviar el formulario, podrá ejecutarlo.

0

que utiliza este truco PHP hacky justo después encomiendo a la base de datos, pero antes de la secuencia de comandos se representan a partir de mi _GET petición .:

if(!empty($_POST['contains_script'])) { 
    echo "<script>document.location='template.php';</script>"; 
} 

Ésta era la solución más barata para mí.

1

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 produce al ingresar JS o HTML en un campo de formulario, pero también se puede activar de otras maneras, 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 desee como valor, enlazar a esa URL con el valor JS malicioso y causar problemas a los usuarios.

En casi cada caso, esto se puede arreglar por HTML encoding the response, aunque hay excepciones. Por ejemplo, esto no será seguro para el contenido dentro de una etiqueta <script>. Otros casos específicos se pueden manejar de manera diferente; por ejemplo, inyectar información en una URL es mejor atendido por la codificación URL.

Como se mencionó Kendall Hopkins, puede haber algunos casos cuando realmente se quiere JavaScript de entradas de formulario para ser ejecutado, como la creación de una aplicación como JSFiddle. En esos casos, te recomiendo que al menos revises la entrada de tu código backend antes de volver a escribirla ciegamente. Después de eso, puedes utilizar el método que mencionó para evitar el bloqueo de XSS (al menos en Chrome), pero ten en cuenta que te está abriendo a los atacantes.

Cuestiones relacionadas