Kryptischer "Skriptfehler". berichtet in Javascript in Chrome und Firefox

199

Ich habe ein Skript, das Javascript-Fehler auf meiner Website erkennt und zur Berichterstellung an mein Backend sendet. Es werden der erste aufgetretene Fehler, die vermutete Zeilennummer und die Uhrzeit gemeldet.

BEARBEITEN, um doctype einzuschließen:

<!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>

Aufgrund dieses Skripts sind mir alle Javascript-Fehler, die auf meiner Website auftreten, sehr bewusst. Einer der größten Straftäter ist "Script Error". in Zeile 0. in Chrome 10+ und Firefox 3+. Dieser Fehler ist im Internet Explorer nicht vorhanden (oder kann als etwas anderes bezeichnet werden?).

Korrektur (23.05.2013): Dieser Fehler " Skriptfehler , Zeile 0" wird jetzt in IE7 und möglicherweise in anderen Versionen von IE angezeigt. Möglicherweise ein Ergebnis eines kürzlich durchgeführten IE-Sicherheitspatches, da dieses Verhalten zuvor nicht vorhanden war.

Hat jemand eine Idee, was dieser Fehler bedeutet oder was ihn verursacht? Es passiert bei ungefähr 0,25% meiner gesamten Seitenladungen und repräsentiert die Hälfte der gemeldeten Fehler.

Mike Sherov
quelle
Was ist dein Doctype? Wenn Sie keinen XHTML-Doctype deklarieren, benötigen Sie kein CDATA, weshalb möglicherweise Skriptfehler auftreten.
James
Ich schätze die Hilfe ... Der Doctype wurde hinzugefügt: XHTML. Außerdem passiert es nur bei 0,25% der Seitenladungen ... Ich würde denken, dass es etwas Exotischeres ist.
Mike Sherov
3
@ Jayp: Nur erwähnen. XHTML-Doctype ist immer noch HTML-Parser. Sie müssen Inhalte senden application/xhtml+xml, um sie im XHTML-Parser auszuführen (wie in der XHTML-Spezifikation angegeben). Es gibt eine ganze Menge Inhalte, die behaupten, XHTML zu sein, aber normalen HTML-Doctype senden. Aufgrund der falschen Verwendung von XHTML durch Inhaltsersteller haben Browser beschlossen, nur XML-Parser zu verwenden application/xhtml+xml(es ist ein wirklich strenger Parser). In hixie.ch/advocacy/xhtml und webdevout.net/articles/beware-of-xhtml wird angegeben , warum nicht HTML-Parser mit XHTML verwendet werden soll.
Konrad Borowski
11
Seufz ... aus Liebe zu Gott, jeder, der dies liest, bitte lassen Sie Ihre Fehlermeldungen genau erklären , was schief gelaufen ist! Indem Sie sich 30 Sekunden Mühe beim Schreiben sparen, verschwenden Sie die Mannjahre der Welt!
Roman Starkov
1
Sie ignorieren Fehler beim Laden von Skriptfehlern. Warum? Sind sie sicher zu ignorieren?
Rampr

Antworten:

261

Der "Skriptfehler". tritt in Firefox, Safari und Chrome auf, wenn eine Ausnahme gegen die Richtlinie des Browsers mit demselben Ursprung verstößt, dh wenn der Fehler in einem Skript auftritt, das in einer anderen Domäne als der Domäne der aktuellen Seite gehostet wird.

Dieses Verhalten soll verhindern, dass Skripte Informationen an externe Domänen weitergeben. Als Beispiel dafür, warum dies notwendig ist, stellen Sie sich einen versehentlichen Besuch vor evilsite.com, der eine Seite mit dient <script src="yourbank.com/index.html">. (Ja, wir zeigen dieses Skript-Tag auf HTML, nicht auf JS). Dies führt zu einem Skriptfehler, der jedoch interessant ist, da er uns mitteilen kann, ob Sie angemeldet sind oder nicht. Wenn Sie angemeldet sind, liegt der Fehler möglicherweise vor 'Welcome Fred...' is undefined, wenn dies nicht der Fall ist 'Please Login ...' is undefined. Etwas in diese Richtung.

Wenn evilsite.com dies für die rund 20 besten Bankinstitute tut, haben sie eine ziemlich gute Vorstellung davon, welche Bankenseiten Sie besuchen, und könnten eine viel gezieltere Phishing-Seite bereitstellen. (Dies ist natürlich nur ein Beispiel. Es zeigt jedoch, warum Browser nicht zulassen sollten, dass Daten Domänengrenzen überschreiten.)

Ich habe dies in den neuesten Versionen von Safari, Chrome und Firefox getestet - alle tun dies. IE9 tut dies nicht - es behandelt Ausnahmen mit x Ursprung genauso wie Ausnahmen mit gleichem Ursprung. (Und Opera unterstützt keinen Fehler.)

Aus dem Maul des Pferdes: WebKit-Quelle, die die Herkunft überprüft, wenn Ausnahmen an onerror () übergeben werden. Und die Firefox-Quelle, die dies überprüft .

UPDATE (21.10.11) : Der Firefox-Fehler, der dieses Problem verfolgt, enthält einen Link zu dem Blog-Beitrag, der dieses Verhalten inspiriert hat.

UPDATE (02.12.14) : Sie können jetzt die vollständige domänenübergreifende Fehlerberichterstattung in einigen Browsern aktivieren, indem Sie ein crossoriginAttribut für Skript-Tags angeben und den Server die entsprechenden CORS- HTTP- Antwortheader senden lassen .

Broofa
quelle
3
Danke dafür. Ich hätte gerne ein bisschen Klarheit. Ich sehe detaillierte Fehlermeldungen von Skripten, die ich ständig auf meiner Seite einbinde. Wenn ich beispielsweise jQuery aus Googles CDN einbinde und damit ein nicht vorhandenes Element auf meiner Seite manipuliere, wird ein Fehler angezeigt, der auf Googles CDN verweist. Wollen Sie damit "Skriptfehler" sagen? passiert, weil das Remote-Skript die Ausnahme auslöst?
Mike Sherov
150
Sie hätten gedacht, jemand hätte den Sinn gehabt zu sagen: "Ein Remote-Skript hat einen Fehler ausgelöst, der aufgrund der Richtlinie mit demselben Ursprung verborgen war", anstatt sich zu fragen, was schief gelaufen ist, oder? ...
Roman Starkov
3
@broofa Bedeutet das, dass ich bessere Ausnahmen bekomme, wenn ich jquery auf meiner Domain hoste, anstatt Googles CDN zu verwenden?
Paul Biggar
6
Kleines Update. Dies geschieht auch lokal, wenn eine Seite über file: // geladen wird und das Skript über eval () ausgeführt wird. Kleiner Anwendungsfall, aber immer noch :)
Willem Mulder
6
Nach einigen Nachforschungen stellte ich fest, dass a Script Error.auch auftritt, wenn der Benutzer eine Safari-Erweiterung installiert hat (wahrscheinlich die gleiche für Firefox-Plug-Ins), die fehlerhaften JavaScript-Code einfügt
Alex Hoppen
49

Ein Update für diejenigen, die in Zukunft auf diese Frage stoßen werden: broofa hat Recht mit der Antwort und es gibt keine Problemumgehung dafür.

Offensichtlich sind andere auf diese Einschränkung gestoßen, und einige Fehler, die eine Korrektur anforderten, wurden für Firefox: Bug 69301 und für WebKit: Bug 70574 eingereicht

Die gute Nachricht ist, dass der Fehler für Firefox mit der Veröffentlichung von Firefox 13 behoben wurde. So verwenden Sie ihn:

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

crossoriginentspricht crossorigin=anonymousund weist den Browser an , einen CORS-Abruf des Skripts durchzuführen, ohne Anmeldeinformationen zu senden.

Sie müssen sicherstellen, dass das Skript mit einem Access-Control-Allow-OriginHTTP-Headerwert gesendet wird, der der anfordernden Domäne entspricht, z.

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

Andernfalls bricht der Browser das Laden des Skripts ab .

Für Apache:

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

(Siehe CORS-Beispiele für andere Webserver .)

Wenn Sie Skripte in PHP senden:

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

Ich habe dies getestet und es funktioniert wie erwartet. Alle Fehler aus der Datei script.js werden vom window.onerrorHandler mit Nachrichten-, Datei- und Zeilendetails abgefangen .

Der WebKit-Fehler wurde noch nicht behoben, aber ein Patch wurde vorgeschlagen (und verwendet dieselbe Lösung). Hoffentlich wird das Update bald veröffentlicht.

Weitere Informationen zu CORS finden Sie hier: http://enable-cors.org/

adig
quelle
2
Gute Zusammenfassung: blog.errorception.com/2012/12/…
Sam
1
Re Webkit. Wenn Sie dieses meinen, sieht es so aus, als ob es jetzt behoben ist: bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek
3
Angenommen, wir möchten JS-Fehler in mysite.com/index.php überwachen, die eine JS-Datei von einer externen Partei enthalten (z. B. dem Server apiprovider.com/api.js eines API-Anbieters). In diesem Fall haben wir keinen Zugriff auf diesen Server, daher können wir den Header "Access-Control-Allow-Origin" nicht hinzufügen. Gibt es eine Möglichkeit, Fehlermeldungen von api.js zu erhalten?
Eugenio
23

Dieser brauchte ziemlich viel, um herauszufinden.

Wir haben eine Reihe von Dingen unternommen, um zu versuchen, das Problem zu lösen, einschließlich der Rückspeisung des GANZEN Dokumentkörpers über Ajax auf unsere Server, um dies herauszufinden.

Ich bin mir immer noch nicht sicher, was "Skriptfehler" verursacht. (mit dem Zeitraum BTW wird dies in unserem Ajax-Logger angezeigt) in Firefox, aber in Chrome konnten wir es auf ...

Trommelwirbel...

Die automatische Übersetzungsfunktion von Google Chrome.

Viele englischsprachige Menschen wissen wahrscheinlich nicht einmal über diese Funktion Bescheid, aber um sie zu testen, besuchen Sie vermutlich eine nicht englischsprachige Website mit Chrome. Oder noch besser, wenn Sie die Chrome-Optionen durchgehen, können Sie die Browsersprache ändern. Ändern Sie es in etwas Nicht-Englisches, starten Sie den Browser neu und besuchen Sie eine englische Site.

In der oberen Leiste wird gefragt, ob Chrome die Seite für Sie übersetzen soll.

In unserem Fall hat der Übersetzer das Problem sowieso verursacht, da er ein Skript-Tag in Ihren Dokumententext einfügt und (hier erraten) ein JS-basiertes System verwendet, um den Inhalt an die Server von Google zu senden und ihn zum Übersetzen zu bewegen.

Obwohl der Fehler in der Konsole nicht referenziert war, lautete die Nachricht, die an window.onerror gesendet wurde, "Skriptfehler".

Wie auch immer, es gibt eine Heilung.

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

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

Dies wird zwei Dinge bewirken (soweit wir wissen, vielleicht mehr?):

a) Deaktivieren Sie, dass die Übersetzungsleiste in Chrome angezeigt wird.

b) Deaktivieren Sie die Übersetzung der Seite über translate.google.com.

In unserer Situation löste dies sowieso eine TONNE dieser "Skriptfehler". Probleme, die wir hatten.

Entschuldigen Sie die Rechtschreibfehler in diesem Beitrag, ich bin immer noch in einem nicht-englischen Modus in Chrome und schreibe dies, und die Rechtschreibprüfung ist nicht auf Englisch eingestellt;) Zeit zum Zurückschalten.

Genießen!

anonym-one
quelle
4
Der direkte Grund ist wahrscheinlich, dass das Übersetzerskript von einer anderen Domäne als der Webseite ausgeführt wurde und onerror(zumindest in Firefox) in einem solchen Fall nur "Skriptfehler" anzeigt.
Tgr
10

Aufgrund des niedrigen Prozentsatzes können Sie davon ausgehen, dass es sich nicht um normale Benutzer handelt. Wahrscheinlich Benutzer mit Benutzer-Skripten, Lesezeichen oder sogar nur mit der Konsole auf Ihrer Website herumspielen. Wenn Sie den gesamten HTML-Code einer Seite haben, auf der dies geschieht, können Sie diese Theorie besser testen. Sowie der komplette Fehler. Es sollte dir eine URL geben, ist es immer das gleiche? Ist die Zeile wirklich 0 oder nur undefiniert?

Ich denke nicht, dass es eine gute Idee ist, Standardwerte in Ihrem parseInt(ln || 0)Fehler festzulegen, und die 0 kommt wahrscheinlich von, wenn der Fehler nicht wirklich auf der Seite ist (siehe Beispiele oben).

Das Hinzufügen eines if, um festzustellen, ob die Zeile entweder im JavaScript bekannt ist, um diese Fehler zu ignorieren (da sie wahrscheinlich nicht aus Ihrem eigenen Code stammen) oder im serverseitigen Code, um sie separat zu behandeln, wäre imo besser .

=== BEARBEITEN === Gehe zu: http://www.xavierm02.net/AZE/ Installiere die Datei user.js (ich habe es in Chrome gemacht, aber es sollte auch in Firefox funktionieren). Öffnen Sie dann die HTML-Seite im selben Browser. Es zeigt Ihnen den Fehler (ich habe nur diesen Insteal der Berichterstattung an den Server geändert, er schreibt ihn auf die Seite). Mit 0 als Zeilennummer.

xavierm02
quelle
Die URL ist gleichmäßig auf die Seiten meiner Website verteilt. Ich vermute auch Lesezeichen oder sogar Erweiterungen oder Themen, wenn man bedenkt, dass es sich um FF und Chrome handelt. Ich würde jedoch gerne in der Lage sein, diese Fehlermeldung genau zu wiederholen, bevor ich sie sicher ignoriere.
Mike Sherov
Ersetzen Sie Ihre Zeile durch (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());und Sie sehen wahrscheinlich keine URL (da es sich um eine Erweiterung oder etwas Lokales handelt, sodass der Browser Sie nicht anzeigt) und keine Zeilennummer.
Xavierm02
Übrigens sollten Sie den Zeitstempel lieber mit Ihrem Server als mit JS abrufen (und vielleicht sogar nur die Version anstelle des Zeitstempels).
Xavierm02
1
Tatsächlich sollte JS nur die Rohdaten senden und PHP sollte sich darum kümmern, die Ladefehler zu ignorieren und so weiter.
Xavierm02
Ich verarbeite etwas auf der JS-Seite, weil ich nur den ERSTEN relevanten Fehler melden möchte. Daher ordne ich die Fehlerfunktion nach dem Auftreten eines echten Fehlers wieder nichts zu. Dies verhindert auch, dass Fehler, die in Schleifen auftreten, meinen Server beschädigen .
Mike Sherov
3

Ich hatte ein ähnliches Problem: Meine Skripte werden von einer Subdomain bereitgestellt und unterliegen derselben Ursprungsbeschränkung. Ich habe dies jedoch gelöst durch:

1) Hinzufügen jedes Skript-Tags wie folgt:

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

2) Ändern Sie die Apache httpd.conf, indem Sie in jedem vhost Folgendes hinzufügen (Sie müssen mod_headers aktivieren):

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

Hoffe das hilft ...

BEARBEITEN

Auf einem meiner Server konnte ich dies nur durch Ersetzen funktionsfähig machen

*.mydomain.tld

durch

*

Seien Sie sich der Mängel bewusst, die möglicherweise * das Phishing erweiterter Informationen ermöglichen. Eine Dokumentation zu CORS, Same-Origin, Img & Fonts, CDN ist verfügbar, es sind jedoch nur sehr wenige Details zu Crossorigin-Details für Skript-Tags verfügbar.

spoutnik
quelle
1
"* .mydomain.tld" ist kein gültiger Wert für das Crossorigin-Attribut developer.mozilla.org/en-US/docs/Web/HTML/…
icenac
1

In Chrome wird beim Laden von HTML und Javascript auch "Skriptfehler" (in Zeile 0) angezeigt file://. Dies passiert in Firefox nicht. Wahrscheinlich übereifriger Schutz von Chrome gleichen Ursprungs.

Alles ist gut, wenn Sie das gleiche HTML und Javascript über HTTP laden.

Myrne Stol
quelle
1

Wie wäre es mit dem unten. Der Skriptfehler ist nicht über JavaScript verfügbar. Isolieren Sie also einfach diesen speziellen Fall und behandeln Sie ihn so gut wie möglich.

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
quelle
Wie loggst du das auf Karma?
CommonSenseCode
Wollen Sie damit sagen, dass die Browserkonsole die Details enthält, onerror jedoch nicht?
Michael Freidgeim
0

Sowohl Chrome als auch Firefox unter iOS basieren auf der Safari-Webansicht, fügen jedoch eine Reihe von benutzerdefinierten Skripten in jede geladene Seite ein. Wenn in einem dieser Skripte etwas schief geht, wird es ebenfalls gemeldet Script error on line 0. (Vom Browser eingefügte Skripte gelten ebenfalls als Kreuzursprung)

Wie ich in diesem anderen SO-Thread aufgespürt und dokumentiert habe, haben sowohl Chrome als auch Firefox unter iOS Probleme mit ihren benutzerdefinierten Skripten, die SVG-Elemente korrekt behandeln. Zusätzlich zu allen anderen Antworten in diesem Thread: Wenn Sie SVG-Elemente und <a>-Tags in <svg>Tags auf Ihrer Seite verwenden, wird dies Script errorsin iOS Chrome und iOS Firefox gemeldet.

Laszlo Korte
quelle
-1

Ich werde Ihnen sagen, was es für mich in Safari (WebKit) behoben hat: Wenn ich die JS-Rückrufroutine tatsächlich auf die Seite setze , erhalte ich vollständige Informationen. Wenn ich es über ein Tag in eine .js-Datei einbinde, erhalte ich nur den Fehler "Skriptfehler" (ohne Leinenzahl usw.).

Vielleicht hängt das damit zusammen, was Broofa gesagt hat.

Anwyay, also habe ich jetzt einen kleinen Rückruf auf der Seite und dann den Rest der Datei außerhalb der Seite.

kbern
quelle
-2

Ich habe ein bisschen gesucht und es scheint, dass ein "Skriptfehler" bedeutet, dass es Probleme beim Laden einer Datei gab, nach der gesucht wurde. Dies kann ein Caching-Problem auf der Clientseite oder ein Serverproblem aufgrund von Überlastung sein.

Es wird höchstwahrscheinlich durch so etwas verursacht, bei dem das Skript selbst die Datei ist, die es nicht laden kann, daher der Fehler in Zeile 0.

<script type="text/javascript" src="somescript.js"></script>
Nick Brunt
quelle
Gute Gedanken, aber wir ignorieren ausdrücklich, wenn ein Skript nicht geladen werden kann. Wir haben diesen Fehler speziell erkannt und ignoriert.
Mike Sherov
1
Wie haben Sie festgestellt, dass ein Skript nicht geladen werden kann? Ich erinnere mich, dass ich irgendwann Probleme damit hatte. script.onerrorwurde in einigen Browsern nicht wegen fehlender Skripte gefeuert.
Charlie Kilian
"Quellfehler." (little-e) wird sowohl in Webkit- als auch in FF-Quellen angezeigt. Siehe meine Antwort oben. fwiw.
Broofa
-3

Ich habe erlebt

Skriptfehler. Zeile 0

Fehler, die für einige Zeit an unseren Server zurückgemeldet wurden, als der Fehler in Kundenbrowsern auftrat. Gestern zum ersten Mal (nach Einführung "use strict";in unser Javascript) konnte ich dieses Problem in Safari und Chrome unter Windows 7 replizieren. Nachdem ich unseren Code mit alert () -Anweisungen übersät hatte, führte ich diesen Fehler auf die Verwendung einer undefinierten Variablen zurück! zB xx = 123;wo xx nicht mit einer varAnweisung definiert ist .

Safari meldete dies als

ReferenceError: Der strikte Modus verbietet die implizite Erstellung der globalen Eigenschaft 'xx'.

innerhalb von Web Inspector, aber die Funktion window.onerror wurde erkannt

Skriptfehler. Zeile 0

Wandernder Zombie
quelle
-11

Das Durchsuchen des Firefox-Quellcodes zeigt, dass es keine gibt "Script Error.". Daher ist es sehr wahrscheinlich, dass ein Skript auf Ihrer Website einen nicht erfassten Fehler wie den folgenden auslöst:

throw new Error('Script Error.');

Wahrscheinlich wird diese Aussage nur in Firefox und Chrome erreicht.

Ich bin mir nicht sicher, warum es keine Zeilennummer gibt. Vielleicht ein eval()Problem?

user123444555621
quelle
1
Ich habe versucht, dies genau so zu werfen, wie Sie es empfohlen haben. Es wird kein "Skriptfehler" gemeldet. Es wird "Ausgelöste Ausnahme nicht abgefangen: Skriptfehler" gemeldet. Guter Gedanke.
Mike Sherov
Dies kann auch eine der vom Benutzer installierten Erweiterungen sein, die den Fehler verursacht.
Charlie Kilian
1
Auf keinen Fall. Sie werden "Skriptfehler" im gesamten Web sehen, wenn Sie in die richtigen Ebenen schauen.
Amalgovinus
2
Oh nein. Es ist eigentlich "Skriptfehler". mit einem kleinen "e". Deshalb habe ich es nicht im Quellcode gefunden.
user123444555621