Cryptic "Error de script". reportado en Javascript en Chrome y Firefox

199

Tengo una secuencia de comandos que detecta errores de Javascript en mi sitio web y los envía a mi backend para informar. Informa el primer error encontrado, el supuesto número de línea 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 los errores de JavaScript que están ocurriendo en mi sitio. Uno de los mayores delincuentes es "Error de secuencia de comandos". en la línea 0. en Chrome 10+ y Firefox 3+. Este error no existe (¿o puede llamarse de otra manera?) En Internet Explorer.

Corrección (23/05/2013): este error "Error de script, línea 0" ahora se muestra en IE7 y posiblemente en otras versiones de IE. Posiblemente como resultado de un parche de seguridad de IE reciente ya que este comportamiento no existía anteriormente.

¿Alguien tiene alguna idea de lo que 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 reportados.

Mike Sherov
fuente
¿Cuál es tu doctype? Si no está declarando un doctype XHTML, entonces no necesita CDATA, lo que podría ser la razón por la cual hay errores de script.
James
Agradezco la ayuda ... Agregué el doctype: XHTML. Además, sin embargo, solo ocurre en el 0.25% de las cargas de página ... Creo que es algo más exótico.
Mike Sherov
3
@ Jayp: Solo menciono. El doctype XHTML sigue siendo un analizador HTML. Debe enviar contenido application/xhtml+xmlpara ejecutarlo en el analizador XHTML (como dice la especificación XHTML). Hay una gran cantidad de contenido que dice ser XHTML, pero envía un tipo de documento HTML normal. Debido a la forma incorrecta en que los creadores de contenido usan XHTML, los navegadores decidieron usar solo el analizador XML application/xhtml+xml(es un analizador realmente estricto). El hixie.ch/advocacy/xhtml y webdevout.net/articles/beware-of-xhtml dice por qué no usar el analizador HTML con XHTML.
Konrad Borowski
11
Suspiro ... por el amor de Dios, cualquiera que lea esto, por favor haga que sus mensajes de error expliquen exactamente lo que salió mal. ¡Al ahorrarte 30 segundos de esfuerzo al escribirlo, estás desperdiciando el mundo por años!
Roman Starkov
1
Estás ignorando Error al cargar errores de script. ¿Por qué? ¿Son seguros de ignorar?
rampr

Respuestas:

261

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 un script alojado en un dominio que no es el dominio de la página actual.

Este comportamiento es intencional, para evitar que las secuencias de comandos filtren información a dominios externos. Para ver un ejemplo de por qué esto es necesario, imagine visitarlo accidentalmente evilsite.com, que sirve una página con <script src="yourbank.com/index.html">. (sí, estamos apuntando esa etiqueta de script en html, no JS). Esto dará como resultado un error de script, pero el error es interesante porque puede decirnos si ha iniciado sesión o no. Si ha iniciado sesión, 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 principales instituciones bancarias, tendrían una idea bastante clara 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 cualquier dato cruce los límites del dominio).

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

De la boca de los caballos: fuente de WebKit que verifica el origen al pasar excepciones a onerror (). Y la fuente de Firefox que verifica .

ACTUALIZACIÓN (21/10/11) : el error de 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 entre dominios en algunos navegadores especificando un crossoriginatributo en las etiquetas de script y haciendo que el servidor envíe los encabezados de respuesta HTTP CORS apropiados .

broofa
fuente
3
Gracias por esto. Me gustaría un poco de aclaración. Veo mensajes de error detallados de los scripts que incluyo en mi página todo el tiempo. Por ejemplo, si incluyo jQuery del cdn de google y lo uso para manipular un elemento inexistente en mi página, obtengo un error que apunta al CDN de google. ¿Estás diciendo que "Error de secuencia de comandos". está sucediendo porque el script remoto está lanzando la excepción?
Mike Sherov
150
Habría pensado que alguien habría tenido la sensatez de decir "Un script remoto ha arrojado un error que estaba oculto debido a la política del mismo origen", en lugar de dejarle preguntándose qué salió mal, ¿eh? ...
Roman Starkov
3
@broofa ¿Esto significa que obtendré mejores excepciones si alojo jquery en mi dominio en lugar de usar el CDN de Google?
Paul Biggar
66
Pequeña actualización También ocurre localmente cuando una página se carga a través de file: // y el script se ejecuta a través de eval (). Caso de uso menor pero aún :)
Willem Mulder
66
Después de investigar un poco, noté que Script Error.también ocurre si el usuario ha instalado una extensión de Safari (probablemente la misma para los complementos de Firefox) que inyecta código JavaScript con errores
Alex Hoppen
49

Una actualización para aquellos que tropezarán con esta pregunta en el futuro: broofa tiene razón con la respuesta y no hay solución para esto.

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

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

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

crossorigines equivalente crossorigin=anonymousy le dice al navegador que haga una búsqueda CORS del script sin enviar credenciales.

Debe asegurarse de que el script se envíe con un Access-Control-Allow-Originvalor de encabezado HTTP 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 envía scripts en PHP:

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

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

El error de WebKit aún no se ha solucionado, pero se ha propuesto un parche (y utiliza la misma solución). Con suerte, la solución se lanzará pronto.

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

una excavación
fuente
2
Buen resumen: blog.errorception.com/2012/12/…
sam
1
Re webkit. Si te refieres a este, parece que está resuelto ahora: bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek
3
Digamos que queremos monitorear los errores de JS en mysite.com/index.php, que incluye un archivo JS de una parte externa (por ejemplo, un servidor del proveedor de API apiprovider.com/api.js); en este caso no tenemos acceso a ese servidor, por lo que no podemos agregar el encabezado "Access-Control-Allow-Origin". ¿Hay alguna forma de obtener mensajes de error originados en api.js?
Eugenio
23

Este tardó bastante en darse cuenta.

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

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

Rollo de tambor ...

La función de traducción automática de Google Chrome.

Probablemente, muchas personas de habla inglesa ni siquiera conocen esta característica, pero para probarla, supongo que visite un sitio que no esté en inglés con Chrome. O mejor aún, si explora las opciones de Chrome, hay un lugar para cambiar el idioma del navegador. Cambie a algo que no esté en inglés, reinicie el navegador y visite un sitio en inglés.

Debería obtener la barra en la parte superior preguntando 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í) usa algún tipo de sistema basado en JS para enviar el contenido a los servidores de Google y hacer que lo traduzcan.

Aunque el error en la consola fue algo sin referencia, el mensaje que se envió a window.onerror fue "Error de script".

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) Desactiva la barra de traducción para que no aparezca en Chrome.

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

De todos modos, en nuestra situación, esto resolvió UNA TONELADA de estos "Error 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;) Hora de volver atrás.

¡Disfrutar!

anónimo uno
fuente
44
La razón directa es probablemente que la secuencia de comandos del traductor se ejecutó desde un dominio diferente de la página web y onerror(al menos en Firefox) simplemente dice "Error de secuencia de comandos" en tal caso.
Tgr
10

Debido al bajo porcentaje, puede asumir que no son usuarios normales. Probablemente usuarios con guiones de usuario, marcadores o incluso simplemente jugando con la consola en su sitio web. Tener todo el HTML de una página donde sucede podría ayudar a probar esta teoría. Así como el error completo. Debería darte una url, ¿es siempre lo mismo? ¿La línea es realmente 0 o simplemente no está definida?

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

Agregar un if para ver si la línea se conoce 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 cuidarlos por separado sería, en mi opinión, mejor .

=== EDITAR === 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 abra la página html en el mismo navegador. Le mostrará el error (solo cambié esa indicación de informar al servidor, lo escribe en la página). Con 0 como número de línea.

xavierm02
fuente
La URL se distribuye uniformemente entre las páginas de mi sitio. Supongo que los marcadores o incluso extensiones o temas también, teniendo en cuenta que es FF y Chrome. Sin embargo, me encantaría poder reproducir este mensaje de error exactamente antes de ignorarlo de manera segura.
Mike Sherov
Reemplace su línea con (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());y probablemente no verá ninguna URL (porque es una extensión o algo local para que el navegador no lo muestre) y ningún número de línea.
xavierm02
Y, por cierto, debería obtener la marca de tiempo con su servidor en lugar de con JS (e incluso tal vez solo obtener la versión, en lugar de la marca de tiempo).
xavierm02
1
De hecho, JS debería enviar los datos en bruto y PHP debería encargarse de ignorar los errores de carga, etc.
xavierm02
Hago algo de procesamiento en el lado JS porque solo quiero informar el PRIMER error relevante, por lo que reasigno la función onerror a nada después de que se produce un error real. Esto también evita que los errores que están ocurriendo en los bucles hagan que mi servidor se descargue. .
Mike Sherov
3

Tuve un problema similar: mis scripts son atendidos por un subdominio y caen bajo la misma restricción de origen. Sin embargo, resolví esto por:

1) agregando cada etiqueta de script como esta:

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

2) modificando el httpd.conf de apache agregando lo siguiente dentro de cada vhost (debe deshabilitar 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 que potencialmente permiten * robar información extendida. La documentación sobre CORS, del mismo origen, img y fonts, cdn está disponible, pero hay muy pocos datos disponibles sobre los detalles de origen cruzado de etiquetas de script.

Spoutnik
fuente
1
"* .mydomain.tld" no es un valor válido para el atributo crossorigin developer.mozilla.org/en-US/docs/Web/HTML/…
icenac
1

En Chrome, también recibo "Error de script" (en la línea 0) al cargar tanto HTML como Javascript desde file://. Esto no sucede en Firefox. Probablemente sobre celoso protección del mismo origen de Chrome.

Todo está bien al cargar el mismo HTML y Javascript sobre HTTP.

Myrne Stol
fuente
1

¿Qué tal lo de abajo? El error de la secuencia de comandos no está disponible a través de JavaScript, así que solo aísle ese caso en particular y trátelo 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;
};
Ronnie Royston
fuente
¿Cómo se registra esto en el karma?
CommonSenseCode
¿Está diciendo que la consola del navegador tiene los detalles, pero onerror no?
Michael Freidgeim el
0

Tanto Chrome como Firefox en iOS se basan en Safari Webview pero insertan un montón de scripts personalizados en cada página que se carga. Si en alguno de esos scripts algo sale mal, se informa sScript error on line 0 . (Los scripts insertados en el navegador también cuentan como origen cruzado)

Como he rastreado y documentado en este otro hilo SO, tanto Chrome como Firefox en iOS tienen problemas en sus scripts personalizados que manejan los elementos SVG correctamente. Por lo tanto, además de todas las otras respuestas en este hilo: si usa elementos y <a>etiquetas SVG dentro de las <svg>etiquetas en su página, eso generará Script errorsinformes en iOS Chrome y iOS Firefox.

Laszlo Korte
fuente
-1

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

Quizás 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.

kbern
fuente
-2

He buscado un poco y parece que un "Error de script" significa que tuvo problemas para cargar un archivo que se le pidió que buscara. Esto podría ser un problema de almacenamiento en caché en el lado del cliente, o podría ser un problema del servidor debido a una sobrecarga.

Lo más probable es que sea causado por algo así, donde el script en sí es el archivo que no puede cargar, de ahí el error que ocurre en la línea 0.

<script type="text/javascript" src="somescript.js"></script>
Nick Brunt
fuente
Bien pensado, pero ignoramos explícitamente cuando un script no se carga. Hemos detectado ese error específicamente e ignorarlo.
Mike Sherov
1
¿Cómo detectó cuando un script no se carga? Recuerdo haber tenido problemas con eso en un momento. script.onerrorno fue despedido por la falta de scripts en algunos navegadores.
Charlie Kilian
"Error de fuente". (little-e) aparece en las fuentes webkit y FF. Vea mi respuesta arriba. fwiw
broofa
-3

He experimentado

Error de guión. línea 0

los errores se informaron durante algún tiempo a nuestro servidor cuando se produjo el error en los navegadores de los clientes. Ayer por primera vez (después de introducir "use strict";en nuestro javascript) pude replicar este problema en Safari y Chrome en Windows 7. ¡Después de ensuciar nuestro código con declaraciones alert (), rastreé este error hasta el uso de una variable indefinida! por ejemplo, xx = 123;donde xx no está definido con una vardeclaración.

Safari informó esto como

ReferenceError: el modo estricto prohíbe la creación implícita de la propiedad global 'xx'

dentro de Web Inspector, pero la función window.onerror estaba detectando

Error de guión. línea 0

Zombie errante
fuente
-11

El código fuente de Grepping Firefox revela que no hay "Script Error.". Por lo tanto, es muy probable que algún script en su sitio arroje un error no detectado como este:

throw new Error('Script Error.');

Probablemente esta declaración solo se alcanza en Firefox y Chrome.

Sin embargo, no estoy seguro de por qué no hay un número de línea. Tal vez algún eval()problema?

usuario123444555621
fuente
1
He intentado lanzar esto exactamente como me lo has recomendado. No informa "Error de secuencia de comandos". Informa "No se detectó la excepción arrojada: error de secuencia de comandos". Buen pensamiento sin embargo.
Mike Sherov
También podría ser una de las extensiones instaladas por el usuario que está causando el error.
Charlie Kilian
1
De ninguna manera. Verá "Error de secuencia de comandos" en toda la web si mira en los planos correctos.
Amalgovinus
2
UH no. En realidad es "error de script". con una pequeña "e". Por eso no lo encontré en el código fuente.
usuario123444555621