it-swarm-es.com

Cryptic "Script Error". Reportado en Javascript en Chrome y Firefox.

Tengo un script que detecta errores de Javascript en mi sitio web y los envía a mi backend para informar. Reporta el primer error encontrado, el número de línea supuesto y la hora.

EDITAR para incluir doctype:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:fb="http://www.facebook.com/2008/fbml">

...

<script type="text/javascript">
//<![CDATA[
// for debugging javascript!
(function(window){
    window.onerror = function(msg, url, ln) {
        //transform errors
        if (typeof(msg) === 'object' && msg.srcElement && msg.target) {
            if(msg.srcElement == '[object HTMLScriptElement]' && msg.target == '[object HTMLScriptElement]'){
                msg = 'Error loading script';
            }else{
                msg = 'Event Error - target:' + msg.target + ' srcElement:' + msg.srcElement;
            }
        }

        msg = msg.toString();

        //ignore errors
        if(msg.indexOf("Location.toString") > -1){
            return;
        }
        if(msg.indexOf("Error loading script") > -1){
            return;
        }

        //report errors
        window.onerror = function(){};
        (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date());
    };
})(window);
//]]>
</script>

Debido a este script, soy muy consciente de cualquier error de javascript que esté ocurriendo en mi sitio. Uno de los mayores infractores es "Script Error". en la línea 0. en Chrome 10+, y Firefox 3+. Este error no existe (¿o puede llamarse otra cosa?) En Internet Explorer.

Corrección (5/23/2013): Este error "Script Error, Line 0" ahora se muestra en IE7 y posiblemente en otras versiones de IE. Posiblemente el resultado de un parche de seguridad IE reciente como este comportamiento no existía anteriormente.

¿Alguien tiene alguna idea de qué significa este error o qué lo causa? Ocurre en aproximadamente el 0,25% de mis cargas de página generales, y representa la mitad de los errores informados.

195
Mike Sherov

El "error de script". sucede en Firefox, Safari y Chrome cuando una excepción viola la política del mismo origen del navegador , es decir, cuando se produce el error en una secuencia de comandos alojada en un dominio distinto del dominio de la página actual.

Este comportamiento es intencional, para evitar que los scripts filtren información a dominios externos. Para ver un ejemplo de por qué esto es necesario, imagine que visitó evilsite.com accidentalmente, que sirve una página con <script src="yourbank.com/index.html">. (sí, estamos apuntando esa etiqueta de script a html, no a JS). Esto dará como resultado un error de secuencia de comandos, pero el error es interesante porque puede indicarnos si ha iniciado sesión o no. Si está conectado, el error podría ser 'Welcome Fred...' is undefined, mientras que si no lo está, podría ser 'Please Login ...' is undefined. Algo en ese sentido.

Si evilsite.com hace esto para las 20 instituciones bancarias más importantes, tendrían una buena idea de qué sitios bancarios visita, y podrían proporcionar una página de phishing mucho más específica. (Este es solo un ejemplo, por supuesto. Pero ilustra por qué los navegadores no deberían permitir que cualquiera datos crucen los límites del dominio.)

He probado esto en las últimas versiones de Safari, Chrome y Firefox, todos hacen esto. IE9 no lo hace, trata las excepciones de x-Origin de la misma manera que las del mismo origen. (Y Opera no admite onerror.)

Desde la boca de los caballos: fuente de WebKit que verifica Origen cuando pasa excepciones a onerror (). Y la fuente de Firefox que comprueba .

ACTUALIZACIÓN (21/10/11) : El error Firefox que rastrea este problema incluye un enlace a la publicación del blog que inspiró este comportamiento.

ACTUALIZACIÓN (12/2/14) : Ahora puede habilitar el informe completo de errores de dominio cruzado en algunos navegadores especificando un atributo crossorigin en las etiquetas de script y haciendo que el servidor envíe el APROPIADO CORS encabezados de respuesta HTTP.

249
broofa

Una actualización para aquellos que se encontrarán con esta pregunta en el futuro: broofa está en lo correcto con la respuesta y no hay una solución para esto.

Obviamente, otros tropezaron con esta limitación y algunos errores que solicitaron una solución se presentaron para Firefox: Error 69301 y para WebKit: Error 70574

La buena noticia es que el error se resolvió para Firefox con el lanzamiento de Firefox 13. Así es como se usa:

<script src="http://somremotesite.example/script.js" crossorigin>

crossorigin es equivalente a crossorigin=anonymous y le dice al navegador que haga una búsqueda de CORS del script sin enviar credenciales.

Debe asegurarse de que la secuencia de comandos se envíe con un valor de encabezado HTTP Access-Control-Allow-Origin que coincida con el dominio solicitante, por ejemplo,

Access-Control-Allow-Origin: http://myhomesite.example
Access-Control-Allow-Origin: *

de lo contrario, el navegador cancelará la carga del script .

Para Apache:

Header set Access-Control-Allow-Origin "*"

(Y vea ejemplos de CORS para otros servidores web .)

Si estás enviando scripts en PHP:

header('Access-Control-Allow-Origin', 'http://myhomesite.example');

He probado esto y funciona como se esperaba. todos los errores de script.js serán detectados por el controlador window.onerror con detalles de mensaje, archivo y línea.

El error WebKit no se ha solucionado todavía, pero se ha propuesto un parche (y usa la misma solución). Esperemos que la solución sea lanzada pronto.

Más información sobre CORS aquí: http://enable-cors.org/

49
adig

Este tomó un poco de tiempo para averiguar.

Hicimos un montón de cosas para intentar resolverlo, incluso hacer cosas como descargar el cuerpo del documento ENTERO de nuevo a nuestros servidores a través de Ajax para intentar resolverlo.

Todavía no estoy seguro de qué causa el "Error de secuencia de comandos". (Con el período BTW, así es como aparece en nuestro registrador de Ajax) en Firefox, pero en Chrome, pudimos reducirlo a ...

Rollo de tambor ...

La característica de traducción automática de Google Chrome.

Es probable que muchas personas de habla inglesa ni siquiera conozcan esta función, pero para probarlo, creo que visitan un sitio que no está en inglés usando Chrome. O mejor aún, si investiga a través de las opciones de Chrome, hay un lugar para cambiar el idioma del navegador. Cámbielo por algo que no sea inglés, reinicie el navegador y visite un sitio en inglés.

Debería obtener la barra en la parte superior que le pregunta si desea que Chrome traduzca la página por usted.

De todos modos, en nuestro caso, el traductor estaba causando el problema ya que inyecta una etiqueta de script en el cuerpo de su documento y (adivinando aquí) utiliza algún tipo de sistema basado en JS para enviar el contenido a los servidores de Google y hacer que lo traduzcan.

A pesar de que el error en la consola era algo sin referencia, el mensaje que se estaba enviando a window.onerror era "Error de secuencia de comandos".

De todos modos, hay una cura.

http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html

<meta name="google" content="notranslate"/>

Esto hará 2 cosas (hasta donde sabemos, ¿quizás más?):

a) Deshabilita la barra de traducción para que no aparezca en Chrome.

b) Inhabilite la traducción de la página a través de translate.google.com.

De todos modos, en nuestra situación, esto resolvió A TONELADA de estos "errores de script". problemas que estábamos experimentando.

Disculpe los errores de ortografía en esta publicación, todavía estoy en un modo que no está en inglés en Chrome escribiendo esto, y el corrector ortográfico no está configurado en inglés;) Es hora de volver a cambiar.

¡Disfrutar!

23
anonymous-one

Debido al bajo%, puede suponer que no son usuarios normales. Probablemente, los usuarios con scripts de usuario, marcadores o incluso simplemente jugando con la consola en su sitio web. Tener el HTML completo de una página donde suceda podría ayudar a probar esta teoría. Así como el error completo. Debería darte un url, ¿es siempre el mismo? ¿La línea es realmente 0 o simplemente indefinida?

No creo que establecer valores predeterminados en usted onerror sea una buena idea y el 0 probablemente provenga de parseInt(ln || 0) cuando el error no está realmente en la página (vea los ejemplos anteriores).

Agregar un if para ver si se conoce la línea en JavaScript para ignorar esos errores (porque probablemente no provienen de su propio código) o en el código del lado del servidor para resolverlos por separado sería mejor .

=== EDIT === Tengo que: http://www.xavierm02.net/AZE/ Instalar el archivo user.js (lo hice en Chrome pero también debería funcionar en Firefox). Luego abre la página html en el mismo navegador. Le mostrará el error (solo cambié ese insteal de informar al servidor, lo escribe en la página). Con 0 como número de línea.

11
xavierm02

Tuve un problema similar: mis secuencias de comandos son servidas por un subdominio y se encuentran bajo la misma restricción de Origen. Sin embargo, resolví esto por:

1) añadiendo cada etiqueta de script como esta:

<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />

2) modificando Apache httpd.conf agregando lo siguiente dentro de cada vhost (debe habilitar mod_headers):

<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*.mydomain.tld"
</IfModule>

Espero que esto ayude ...

EDITAR

En uno de mis servidores no pude hacer que esto funcionara, excepto al reemplazar

*.mydomain.tld

por

*

Tenga en cuenta las fallas con la posibilidad de que * falsifique información ampliada. La documentación sobre CORS, same-Origin, img & fonts, cdn está disponible, pero hay muy poca información sobre la etiqueta de script crossorigin details está disponible.

3
spoutnik
1

¿Qué tal el siguiente? El error de la secuencia de comandos no está disponible a través de JavaScript, por lo tanto, aísle ese caso en particular y manipúlelo lo mejor que pueda.

window.onerror = function (msg, url, lineNo, columnNo, error) {
    var string = msg.toLowerCase();
    var substring = "script error";
    if (string.indexOf(substring) > -1){
        alert('Script Error: See Browser Console for Detail');
    } else {
        alert(msg, url, lineNo, columnNo, error);
    }
  return false;
};
1
Ron Royston

En Chrome, también obtengo "Error de secuencia de comandos" (en la línea 0) al cargar HTML y Javascript desde file://. Esto no sucede en Firefox. Probablemente demasiado entusiasta protección del mismo origen de Chrome.

Todo es bueno cuando se carga el mismo HTML y Javascript sobre HTTP.

1
Myrne Stol

Le diré lo que lo solucionó para mí en Safari (WebKit): si en realidad pongo la rutina de devolución de llamada JS en la página , obtengo la información completa. Si lo incluyo en un archivo .js a través de una etiqueta, solo obtengo el error "Error de secuencia de comandos" (sin número de lino, etc.).

Tal vez esto esté relacionado con lo que dijo Broofa.

Anwyay, así que ahora tengo una pequeña devolución de llamada en la página, y luego el resto del archivo fuera de la página.

0
kbern