"Errore di script" criptico. segnalato in Javascript in Chrome e Firefox


199

Ho uno script che rileva errori Javascript sul mio sito Web e li invia al mio back-end per la segnalazione. Riporta il primo errore riscontrato, il numero di riga presunto e l'ora.

MODIFICA per includere 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>

A causa di questo script, sono pienamente consapevole di eventuali errori javascript che si verificano sul mio sito. Uno dei più grandi delinquenti è "Errore di script". sulla linea 0. in Chrome 10+ e Firefox 3+. Questo errore non esiste (o può essere chiamato qualcos'altro?) In Internet Explorer.

Correzione (23/05/2013): questo errore "Errore script, riga 0" viene ora visualizzato in IE7 e probabilmente in altre versioni di IE. Probabilmente il risultato di una recente patch di sicurezza IE poiché questo comportamento in precedenza non esisteva.

Qualcuno ha idea di cosa significhi questo errore o cosa lo causi? Succede su circa lo 0,25% dei miei pageload complessivi e rappresenta la metà degli errori segnalati.


Qual è il tuo tipo di documento? Se non stai dichiarando un doctype XHTML, non hai bisogno di CDATA, il che potrebbe essere il motivo per cui ci sono errori di script.
James,

Apprezzo l'aiuto ... Aggiunto il doctype: XHTML. Inoltre, però, si verifica solo sullo 0,25% dei pageload ... Penso che sia qualcosa di più esotico.
Mike Sherov,

3
@jayp: sto solo citando. Il doctype XHTML è ancora parser HTML. Devi inviare il contenuto application/xhtml+xmlper eseguirlo nel parser XHTML (come dice la specifica XHTML). C'è un sacco di contenuto che afferma di essere XHTML, ma invia un normale doctype HTML. A causa del modo in cui i creatori di contenuti utilizzano XHTML in modo errato, i browser hanno deciso di utilizzare solo il parser XML application/xhtml+xml(è un parser davvero rigoroso). Il hixie.ch/advocacy/xhtml e webdevout.net/articles/beware-of-xhtml spiega perché non utilizzare il parser HTML con XHTML.
Konrad Borowski

11
Sospiro ... per amore di Dio, chiunque legga questo, per favore, fai in modo che i tuoi messaggi di errore spieghino esattamente cosa è andato storto! Salvando te stesso 30 secondi di sforzo per scriverlo, stai sprecando il mondo anni-uomo!
Roman Starkov,

1
Stai ignorando Errore durante il caricamento degli errori di script. Perché? Sono sicuri da ignorare?
rampr,

Risposte:


261

"Errore di script". si verifica in Firefox, Safari e Chrome quando un'eccezione viola i criteri della stessa origine del browser, ovvero quando l'errore si verifica in uno script ospitato su un dominio diverso dal dominio della pagina corrente.

Questo comportamento è intenzionale per impedire agli script di perdere informazioni su domini esterni. Per un esempio del perché questo è necessario, immagina di visitare accidentalmente evilsite.com, che serve una pagina con <script src="yourbank.com/index.html">. (sì, stiamo puntando quel tag di script su html, non su JS). Ciò comporterà un errore di script, ma l'errore è interessante perché può dirci se hai effettuato l'accesso o meno. Se hai effettuato l'accesso, l'errore potrebbe essere 'Welcome Fred...' is undefined, mentre in caso contrario potrebbe esserlo 'Please Login ...' is undefined. Qualcosa del genere.

Se evilsite.com lo fa per i primi 20 istituti bancari, avrebbe una buona idea di quali siti bancari visiterai e potrebbe fornire una pagina di phishing molto più mirata. (Questo è solo un esempio, ovviamente. Ma illustra perché i browser non dovrebbero consentire ai dati di oltrepassare i confini del dominio.)

L'ho provato nelle ultime versioni di Safari, Chrome e Firefox: lo fanno tutti. IE9 no: tratta le eccezioni x-origin allo stesso modo di quelle della stessa origine. (E Opera non supporta onerror.)

Dalla bocca dei cavalli: sorgente WebKit che controlla l'origine quando si passano le eccezioni a onerror (). E la fonte di Firefox che controlla .

AGGIORNAMENTO (21/10/11) : il bug di Firefox che tiene traccia di questo problema include un collegamento al post del blog che ha ispirato questo comportamento.

AGGIORNAMENTO (12/12/2014) : ora è possibile abilitare la segnalazione degli errori tra domini completi su alcuni browser specificando un crossoriginattributo sui tag script e facendo in modo che il server invii le intestazioni di risposta HTTP CORS appropriate .


3
Grazie per questo. Vorrei un po 'di chiarimenti. Vedo sempre messaggi di errore dettagliati dagli script che includo sulla mia pagina. Ad esempio, se includo jQuery dal cdn di google e lo uso per manipolare un elemento inesistente sulla mia pagina, ottengo un onerror che punta alla CDN di google. Stai dicendo che "Errore di script". sta accadendo perché lo script remoto sta generando l'eccezione?
Mike Sherov,

150
Avresti pensato che qualcuno avrebbe avuto il senso di dire "Uno script remoto ha generato un errore nascosto a causa della stessa politica di origine", invece di lasciarti chiederti cosa è andato storto, eh? ...
Roman Starkov

3
@broofa Questo significa che andrò meglio tranne che se ospito jquery sul mio dominio invece di usare la CDN di Google?
Paul Biggar,

6
Piccolo aggiornamento. Succede anche localmente quando una pagina viene caricata tramite file: // e lo script viene eseguito tramite eval (). Caso d'uso minore ma comunque :)
Willem Mulder,

6
Dopo alcune indagini ho notato che Script Error.si verifica anche se l'utente ha installato un'estensione Safari (probabilmente la stessa per i plug-in di Firefox) che inietta codice JavaScript con errori
Alex Hoppen

49

Un aggiornamento per coloro che si imbatteranno in questa domanda in futuro: broofa ha ragione con la risposta e non c'è soluzione alternativa per questo.

Ovviamente altri si sono imbattuti in questa limitazione e alcuni bug che richiedono una correzione sono stati archiviati per Firefox: Bug 69301 e per WebKit: Bug 70574

La buona notizia è che il bug è stato risolto per Firefox con il rilascio di Firefox 13. Ecco come lo usi:

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

crossorigin è equivalente a crossorigin=anonymous e indica al browser di eseguire un recupero CORS dello script senza inviare credenziali.

È necessario assicurarsi che lo script venga inviato con un Access-Control-Allow-Origin valore di intestazione HTTP corrispondente al dominio richiedente, ad es.

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

altrimenti il ​​browser annullerà il caricamento dello script .

Per Apache:

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

(E vedi esempi CORS per altri server Web .)

Se stai inviando script in PHP:

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

Ho provato questo e funziona come previsto. tutti gli errori di script.js verranno rilevati dawindow.onerror gestore con i dettagli di messaggio, file e riga.

Il bug di WebKit non è stato ancora corretto, ma è stata proposta una patch (e utilizza la stessa soluzione). Spero che la correzione venga rilasciata presto.

Maggiori informazioni su CORS qui: http://enable-cors.org/



1
Re webkit. Se vuoi dire questo, sembra che sia stato risolto ora: bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek

3
Supponiamo di voler monitorare gli errori JS in mysite.com/index.php, che include un file JS di una parte esterna (ad es. Il server di un provider API apiprovider.com/api.js); in questo caso non abbiamo accesso a quel server, quindi non possiamo aggiungere l'intestazione "Access-Control-Allow-Origin". Esiste un modo per ottenere messaggi di errore originati da api.js?
Eugenio,

23

Questo ci è voluto un po 'per capire.

Abbiamo fatto un sacco di cose per provare a risolverlo, incluso fare come scaricare TUTTO il corpo del documento sui nostri server tramite Ajax per cercare di capirlo.

Non sono ancora sicuro di ciò che provoca "Errore di script". (con il periodo BTW, è così che appare nel nostro logger Ajax) in Firefox, ma in Chrome, siamo riusciti a restringerlo a ...

Rullo di tamburi...

La funzione di traduzione automatica di Google Chrome.

Molte persone di lingua inglese probabilmente non conoscono nemmeno questa funzione, ma per testarla, suppongo che visiti un sito non inglese usando Chrome. O ancora meglio, se si analizzano le opzioni di Chrome, è possibile cambiare la lingua del browser. Modificalo in qualcosa di non inglese, riavvia il browser e visita un sito inglese.

Dovresti ottenere la barra in alto che ti chiede se desideri che Chrome traduca la pagina per te.

Nel nostro caso, comunque, il traduttore stava causando il problema poiché inietta un tag di script nel corpo del documento e (indovinando qui) utilizza una sorta di sistema basato su JS per inviare il contenuto ai server di Google e convincerlo a tradurlo.

Anche se l'errore nella console era qualcosa di non referenziato, il messaggio che veniva inviato a window.onerror era "Errore di script".

Comunque, c'è una cura.

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

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

Questo farà 2 cose (per quanto ne sappiamo, forse di più?):

a) Disabilitare la barra di traduzione dal pop-up in Chrome.

b) Disabilitare la traduzione della pagina tramite translate.google.com.

Nella nostra situazione comunque, questo ha risolto A TON di questi "Script Script". problemi che stavamo riscontrando.

Scusa gli errori di ortografia in questo post, sto ancora scrivendo una modalità non inglese in Chrome e il controllo ortografico non è impostato in inglese;) È ora di tornare indietro.

Godere!


4
Il motivo diretto è probabilmente che lo script del traduttore è stato eseguito da un dominio diverso rispetto alla pagina Web e onerror(almeno in Firefox) dice semplicemente "Errore di script" in tal caso.
Tgr

10

A causa della bassa percentuale, puoi presumere che non siano utenti normali. Probabilmente utenti con script utente, bookmarklet o forse anche solo scherzi con la console sul tuo sito web. Avere l'intero HTML di una pagina in cui succede potrebbe aiutare a testare questa teoria. Oltre all'errore completo. Dovrebbe darti un url, è sempre lo stesso? La linea è davvero 0 o non è definita?

Non penso che l'impostazione di valori predefiniti in te sia una buona idea e che probabilmente lo 0 venga parseInt(ln || 0) quando l'errore non è realmente nella pagina (vedi esempi sopra).

Aggiungendo un if per vedere se la linea è nota o in JavaScript per ignorare quegli errori (perché probabilmente non provengono dal proprio codice) o nel codice lato server per occuparsene separatamente, imo, sarebbe meglio .

=== MODIFICA === Vai a: http://www.xavierm02.net/AZE/ Installa il file user.js (l'ho fatto su Chrome ma dovrebbe funzionare anche su Firefox). Quindi apri la pagina html sullo stesso browser. Ti mostrerà l'errore (ho solo cambiato quell'istinto di segnalazione al server, lo scrive sulla pagina). Con 0 come numero di riga.


L'URL viene distribuito uniformemente tra le pagine del mio sito. Sto indovinando bookmarklet o anche estensioni o temi, considerando FF e Chrome. Tuttavia, mi piacerebbe poter riproporre questo messaggio di errore esattamente prima di ignorarlo in modo sicuro.
Mike Sherov,

Sostituisci la tua linea con (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());e probabilmente non vedrai alcun URL (perché è un'estensione o qualcosa di locale quindi il browser non ti mostra) e nessun numero di linea.
xavierm02,

E a proposito, dovresti piuttosto ottenere il timestamp con il tuo server piuttosto che con JS (e forse anche solo ottenere la versione, anziché il timestamp).
xavierm02,

1
In effetti, JS dovrebbe semplicemente inviare i dati non elaborati e PHP dovrebbe occuparsi di ignorare gli errori di caricamento e così via.
xavierm02,

Faccio un po 'di elaborazione sul lato JS perché voglio solo segnalare il PRIMO errore rilevante, quindi riassegno la funzione onerror a nulla dopo che si è verificato un errore reale. Ciò impedisce anche che gli errori che si verificano nei loop ddos'dando il mio server .
Mike Sherov,

3

Ho avuto un problema simile: i miei script sono serviti da un sottodominio e rientrano nella stessa restrizione di origine. Tuttavia, ho risolto questo problema con:

1) aggiungendo ogni tag di script come questo:

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

2) modificando apache httpd.conf aggiungendo quanto segue all'interno di ogni vhost (è necessario abilitare mod_headers):

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

Spero che questo ti aiuti ...

MODIFICARE

Su uno dei miei server non sono riuscito a renderlo funzionale se non mediante la sostituzione

*.mydomain.tld

di

*

Fai attenzione ai difetti che consentono potenzialmente * di phishing di informazioni estese. Documentazione su CORS, stessa origine, img & fonts, cdn è disponibile ma sono disponibili pochissimi dettagli sui tag crossorigin dei tag script.


1
"* .mydomain.tld" non è un valore valido per l'attributo crossorigin developer.mozilla.org/en-US/docs/Web/HTML/…
icenac

1

In Chrome, ottengo anche "Errore di script" (sulla riga 0) durante il caricamento di HTML e Javascript da file://. Questo non succede in Firefox. Probabilmente troppo zelante protezione della stessa origine di Chrome.

Tutto va bene quando si carica lo stesso HTML e Javascript su HTTP.


1

Che ne dici di sotto. L'errore di script non è disponibile tramite JavaScript, quindi basta isolare quel caso particolare e gestirlo nel miglior modo possibile.

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;
};

come si registra questo sul karma?
CommonSenseCode

Stai dicendo che la console del browser ha i dettagli, ma onerror no?
Michael Freidgeim,


0

Sia Chrome che Firefox su iOS si basano su Safari Webview ma inseriscono una serie di script personalizzati in ogni pagina caricata. Se in uno di questi script qualcosa va storto, viene segnalato anche s Script error on line 0. (Anche gli script inseriti nel browser contano come origine incrociata)

Come ho rintracciato e documentato in questo altro thread SO, sia Chrome che Firefox su iOS hanno problemi nei loro script personalizzati che gestiscono correttamente gli elementi SVG. Quindi, oltre a tutte le altre risposte in questa discussione: se usi elementi e <a>tag SVG all'interno dei <svg>tag della tua pagina, ciò comporterà la Script errorssegnalazione in iOS Chrome e iOS Firefox.


-1

Ti dirò cosa l'ha risolto per me su Safari (WebKit): se inserisco effettivamente la routine di callback JS sulla pagina , ottengo informazioni complete. Se lo includo in un file .js tramite un tag, visualizzo semplicemente l'errore "Errore script" (senza lino, ecc.).

Forse questo è legato a ciò che ha detto Broofa.

Anwyay, quindi ora ho un piccolo callback nella pagina, e poi il resto del file al di fuori della pagina.


-2

Ho fatto un po 'di ricerca e sembra che un "Errore di script" significhi che ha avuto problemi a caricare un file che è stato chiesto di cercare. Questo potrebbe essere un problema di memorizzazione nella cache sul lato client o potrebbe essere un problema del server a causa di un sovraccarico.

Molto probabilmente è causato da qualcosa del genere in cui lo script stesso è il file che non può caricare, quindi l'errore si verifica sulla riga 0.

<script type="text/javascript" src="somescript.js"></script>

Buona idea, ma ignoriamo esplicitamente quando non è possibile caricare uno script. Abbiamo rilevato questo errore in modo specifico e lo abbiamo ignorato.
Mike Sherov,

1
Come hai rilevato quando non è possibile caricare uno script? Ricordo di aver avuto problemi con quello ad un certo punto. script.onerrornon veniva licenziato per gli script mancanti in alcuni browser.
Charlie Kilian,

"Errore di origine." (little-e) appare in entrambe le fonti webkit e FF. Vedi la mia risposta sopra. FWIW.
broofa,

-3

Ho sperimentato

Errore di script. linea 0

errori da tempo riportati sul nostro server quando si è verificato l'errore nei browser dei clienti. Ieri per la prima volta (dopo aver introdotto "use strict";nel nostro javascript) sono stato in grado di replicare questo problema in Safari e Chrome su Windows 7. Dopo aver disseminato il nostro codice di istruzioni alert () ho rintracciato questo errore fino all'utilizzo di una variabile non definita! ad es. xx = 123;dove xx non è definito con avar un'istruzione.

Safari lo ha segnalato come

ReferenceError: la modalità Strict proibisce la creazione implicita della proprietà globale 'xx'

all'interno di Web Inspector, ma la funzione window.onerror stava rilevando

Errore di script. linea 0


-11

Grepping il codice sorgente di Firefox rivela che non c'è "Script Error.". Pertanto, è molto probabile che alcuni script sul tuo sito generino un errore non rilevato come questo:

throw new Error('Script Error.');

Probabilmente questa affermazione è raggiunta solo in Firefox e Chrome.

Non sono sicuro del perché non ci sia un numero di riga. Forse qualche eval()problema?


1
Ho provato a lanciarlo esattamente come mi hai consigliato. Non riporta "Errore di script". Riporta "Eccezione generata non rilevata: errore di script". Buona idea però.
Mike Sherov,

Potrebbe anche essere una delle estensioni installate dall'utente che causa l'errore.
Charlie Kilian,

1
Non c'è modo. Vedrai "Errore di script" su tutto il Web se guardi nelle giuste placche.
Amalgovinus,

2
Uh, no. In realtà è "Errore di script". con una piccola "e". Ecco perché non l'ho trovato nel codice sorgente.
user123444555621
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.