Críptico " Error de Script."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. Informa 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é sucediendo en mi sitio. Uno de los mayores infractores es "Error de script."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/5/2013): Este error "Script Error, Línea 0" ahora se muestra en IE7 y posiblemente otras versiones de IE. Posiblemente el resultado de un parche de seguridad de IE reciente, ya que este comportamiento anteriormente no existía.

¿Alguien tiene alguna idea de lo que significa este error o lo que lo causa? Sucede en aproximadamente el 0.25% de mis cargas de páginas generales, y representa la mitad de los errores reportados.

Author: Elliot B., 2011-05-06

12 answers

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

Este comportamiento es intencional, para evitar que los scripts filtren información a dominios externos. Para un ejemplo de por qué esto es necesario, imagine visitar accidentalmente evilsite.com, que muestra una página con <script src="yourbank.com/index.html">. (sí, estamos señalando ese guión etiqueta en html, no JS). Esto dará lugar a 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 así.

Si evilsite.com hace esto para las 20 instituciones bancarias más o menos, tendrían una idea bastante buena de qué sitios bancarios visitas, 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 deben permitir que ningún dato cruce los límites de 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 igual que las de origen-mismo. (Y Opera no soporta onerror.)

Desde la boca de horses: Fuente WebKit que comprueba origin al pasar excepciones a onerror(). Y la fuente de Firefox que comprueba.

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

UPDATE (12/2/14): Ahora puede habilitar el informe completo de errores entre dominios en algunos navegadores especificando un crossorigin atributo en las etiquetas de script y hacer que el servidor envíe los encabezados de respuesta HTTP CORS apropiados.

 235
Author: broofa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-22 10:02:52

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

Obviamente otros tropezaron con esta limitación y algunos errores que solicitan una corrección se presentaron 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 usas :

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

crossorigin es equivalente a crossorigin=anonymous y le dice al navegador que haga una recuperación CORS del script sin enviar credenciales.

Debe asegurarse de que el script 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 ver ejemplos CORS para otros servidores web.)

Si está enviando 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á capturado por el controlador window.onerror con detalles de mensaje, archivo y línea.

El error de WebKit no ha sido corregido todavía, pero se ha propuesto un parche (y utiliza la misma solución). Esperemos que la solución será lanzado pronto.

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

 47
Author: adig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-12 20:46:26

Esto tomó bastante tiempo para darse cuenta.

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

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

Redoble de tambores...

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

Muchas personas de habla inglesa probablemente ni siquiera saben acerca de esta característica, pero para probarlo, supongo que visitar un sitio no inglés utilizando Chrome. O mejor aún, si usted cava a través de las opciones de Chrome, hay un lugar para cambiar el idioma del navegador. Cámbialo a algo que no sea inglés, reinicia el navegador y visita un sitio en inglés.

Usted debe obtener la barra en la parte superior preguntando si desea Chrome para traducir la página para usted.

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

A pesar de que el error en la consola era algo no referenciado, el mensaje que se estaba enviando a la ventana.onerror fue " Error de script.".

De todos modos, hay un curar.

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

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

Esto hará 2 cosas (por lo que sabemos, tal vez más?):

A) Desactivar la barra de traducción de aparecer en Chrome.

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

En nuestra situación de todos modos, esto resolvió una TONELADA de estos "Error de Script."problemas que estábamos experimentando.

Disculpen los errores de ortografía en este post, Todavía estoy en un modo no inglés en Chrome escribir esto, y el corrector ortográfico no se establece en inglés ;) Hora de cambiar de nuevo.

Disfrute!

 23
Author: anonymous-one,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-08 21:04:53

Debido al bajo %, puede asumir que no son usuarios normales. Probablemente usuarios con userscripts, bookmarklets o incluso tal vez 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? ¿Es la línea realmente 0 o simplemente indefinida?

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

Agregar un if para ver si la línea es conocida ya sea en el JavaScript para ignorar esos errores (porque probablemente no provienen de su propio código) o en el código del lado del servidor para ocuparse de ellos por separado, imo, sería mejor.

=== EDITAR === Tengo que: http://www.xavierm02.net/AZE / Instale el usuario.archivo js (lo hice en Chrome, pero debería funcionar en Firefox también). A continuación, abra la página html en el mismo navegador. Se mostrará usted 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
Author: xavierm02,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-11 07:19:45

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

1) agregar cada etiqueta de script de esta manera:

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

2) modificando el httpd de apache.conf agregando lo siguiente dentro de cada vhost (debe tener enbable 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 esto funcional excepto por sustitución de

*.mydomain.tld

Por

*

Tenga en cuenta los defectos con el potencial de permitir * para phish información extendida. La documentación sobre CORS, same-origin, img & fonts, cdn está disponible, pero hay muy pocos detalles sobre script tag crossorigin disponibles.

 3
Author: spoutnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-11 15:51:25

En Chrome, también obtengo "Error de script" (en la línea 0) al cargar tanto el HTML como 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
Author: Myrne Stol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 23:23:40

Qué tal lo siguiente. El error de script no está disponible a través de JavaScript, así que solo aísla ese caso en particular y manéjalo lo mejor que puedas.

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
Author: Ron Royston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 19:20:28

Te diré lo que me arregló en Safari (WebKit): Si pongo la rutina de devolución de llamada de JS realmente en la página, entonces obtengo información completa. Si lo incluyo en a .archivo js a través de una etiqueta, solo recibo el error "Script error" (sin número de línea, 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
Author: kbern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-25 21:36:37
 0
Author: Premchandra Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 09:34:48

He hecho un poco de búsqueda 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 la sobrecarga.

Lo más probable es que sea causado por algo como esto, 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>
 -2
Author: Nick Brunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-06 16:19:14

He experimentado

Error de Script. línea 0

Los errores durante algún tiempo se reportaron a nuestro servidor cuando se produjo el error en los navegadores del cliente. 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 sentencias alert() rastreé este error hasta el uso de una variable indefinida! por ejemplo, xx = 123; donde xx no se define con un var instrucción.

Safari informó de esto como

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

Dentro del Inspector Web, pero ventana.la función onerror detectaba

Error de Script. línea 0

 -3
Author: Wandering Zombie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-11 12:13:02

Greping código fuente de Firefox revela que no hay "Script Error.". Por lo tanto, es muy probable que algún script en su sitio esté lanzando un error no capturado como este:

throw new Error('Script Error.');

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

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

 -9
Author: user123444555621,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-10 21:59:03