it-swarm.com.de

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

Ich habe ein Skript, das Javascript-Fehler auf meiner Website erkennt und zur Berichterstellung an mein Backend sendet. Es meldet den ersten aufgetretenen Fehler, die vermutete Zeilennummer und die Uhrzeit.

EDIT um Doctype aufzunehmen:

<!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 JavaScript-Fehler auf meiner Website sehr genau bekannt. Einer der größten Straftäter ist "Script Error". in Zeile 0. in Chrome 10+ und Firefox 3+. Dieser Fehler ist in Internet Explorer nicht vorhanden (oder kann als etwas anderes bezeichnet werden).

Korrektur (23.5.2013): Dieser Fehler "Skriptfehler, Zeile 0" wird jetzt in IE7 und möglicherweise 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? Dies geschieht bei etwa 0,25% meiner gesamten Seitenlast und repräsentiert die Hälfte der gemeldeten Fehler.

189
Mike Sherov

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

Dieses Verhalten ist beabsichtigt, um zu verhindern, dass Skripts Informationen an externe Domänen weitergeben. Ein Beispiel dafür, warum dies notwendig ist, stellen Sie sich vor, Sie versehentlich evilsite.com zu besuchen, das eine Seite mit <script src="yourbank.com/index.html"> enthält. (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, könnte der Fehler 'Welcome Fred...' is undefined sein. Andernfalls könnte es 'Please Login ...' is undefined sein. Etwas in diese Richtung.

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

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

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

UPDATE (21.10.11): Der Firefox-Fehler, der dieses Problem aufzeichnet enthält einen Link zum Blog-Eintrag, der zu diesem Verhalten geführt hat. 

UPDATE (12/2/14): Sie können jetzt die vollständige domänenübergreifende Fehlerberichterstattung in einigen Browsern aktivieren, indem Sie ein crossorigin-Attribut on-Script-Tags angeben und den Server die entsprechenden _ cors _ senden lassen. HTTP-Antwortheader.

244
broofa

Ein Update für diejenigen, die in der Zukunft auf diese Frage stoßen werden: Broofa hat die richtige Antwort, und es gibt keine Abhilfe. 

Andere stolperten natürlich über diese Einschränkung und einige Fehler, die einen Fix forderten, wurden für Firefox eingereicht: Bug 69301 und für WebKit: Bug 70574

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

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

crossorigin ist äquivalent zu crossorigin=anonymous und 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-Origin-HTTP-Header-Wert 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 "*"

(Und siehe CORS-Beispiele für andere Webserver .)

Wenn Sie Skripte in PHP senden: 

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

Ich habe das getestet und es funktioniert wie erwartet. Alle Fehler aus der script.js werden vom window.onerror-Handler mit Informationen zu Nachrichten, Dateien und Zeilen 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/

49
adig

Dieser hat ziemlich viel herausgefunden.

Wir haben ein paar Dinge getan, um das Problem zu lösen. Dazu gehört auch, dass wir den WHOLE-Dokumentkörper über Ajax auf unsere Server zurückgespielt haben, um ihn herauszufinden.

Ich bin immer noch nicht sicher, was "Skriptfehler" verursacht. (Mit der Zeit Übrigens, so sieht es in unserem Ajax-Logger aus) in Firefox, aber in Chrome konnten wir es auf ...

Trommelwirbel...

Die automatische Übersetzungsfunktion von Google Chrome.

Viele englischsprachige Personen wissen wahrscheinlich nicht einmal etwas über diese Funktion, aber um sie zu testen, besuchen Sie eine nicht-englische Website, die Chrome verwendet. Oder noch besser: Wenn Sie die Chrome-Optionen verwenden, können Sie die Browsersprache ändern. Ändern Sie es in etwas Nicht-Englisch, starten Sie den Browser neu und besuchen Sie eine englische Website.

Die Leiste oben sollte gefragt werden, ob Chrome die Seite für Sie übersetzen soll.

In unserem Fall verursachte der Übersetzer das Problem, da er ein Skript-Tag in Ihren Dokumentenkörper einfügte und (hier erraten) eine Art JS-basiertes System verwendet, um den Inhalt an die Server von Google zu senden und ihn zu übersetzen.

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

Auf jeden Fall gibt es eine Heilung.

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

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

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

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

b) Deaktivieren Sie das Übersetzen der Seite über translate.google.com.

In unserer Situation wurde dies A TON dieses "Script Error" gelöst. Probleme, die wir hatten.

Entschuldigen Sie die Rechtschreibfehler in diesem Beitrag. Ich schreibe dies in einem nicht englischen Modus in Chrome und die Rechtschreibprüfung ist nicht auf Englisch eingestellt;) Zeit zum Umschalten.

Genießen!

23
anonymous-one

Aufgrund des niedrigen Prozentsatzes können Sie davon ausgehen, dass sie keine normalen Benutzer sind. Wahrscheinlich Benutzer mit Benutzerskripten, Bookmarklets oder vielleicht einfach nur mit der Konsole auf Ihrer Website herumspielen ... Wenn Sie den gesamten HTML-Code einer Seite haben, auf der dies geschieht, kann dies die Überprüfung dieser Theorie erleichtern. Sowie der komplette Fehler. Es sollte Ihnen eine URL geben, ist es immer gleich? Ist die Zeile wirklich 0 oder nur undefiniert?

Ich halte es nicht für angebracht, Standardwerte in einem anderen Fehler festzulegen, und die 0 kommt wahrscheinlich von parseInt(ln || 0), wenn der Fehler nicht wirklich auf der Seite ist (siehe Beispiele oben).

Das Hinzufügen eines ifs, um zu sehen, 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 gesondert zu behandeln, wäre imo besser .

=== BEARBEITEN === Gehe zu: http://www.xavierm02.net/AZE/ Installiere die user.js-Datei (ich habe es auf Chrome gemacht, sollte es aber Arbeitet auch mit Firefox) . Dann öffnen Sie die HTML-Seite im selben Browser. Es wird Ihnen der Fehler angezeigt (ich habe nur das Insteal der Berichterstellung an den Server geändert, es schreibt es auf die Seite). Mit 0 als Zeilennummer.

11
xavierm02

Ich hatte ein ähnliches Problem: Meine Skripts werden von einer Unterdomäne bereitgestellt und unterliegen derselben Origin-Einschränkung. Ich habe das 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 des Apache httpd.conf durch Hinzufügen der folgenden Einträge in jedem vhost (Sie müssen mod_headers aktivieren):

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

Hoffe das hilft ...

EDIT

Auf einem meiner Server konnte ich diese Funktion nur durch Ersetzen durchführen

*.mydomain.tld

durch

*

Seien Sie sich der Fehler bewusst, die möglicherweise * die Erweiterung erweiterter Informationen ermöglichen. Dokumentation zu CORS, same-Origin, img & fonts, cdn ist verfügbar, jedoch sind nur sehr wenige Informationen zu Skript-Tag-Crossorigin-Details verfügbar.

3
spoutnik

Wie wäre es mit dem unten. Der Skriptfehler ist nicht über JavaScript verfügbar. Isolieren Sie den jeweiligen 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;
};
1
Ron Royston

In Chrome bekomme ich auch "Skriptfehler" (in Zeile 0), wenn sowohl HTML als auch Javascript von file:// geladen werden. Dies passiert nicht in Firefox. Wahrscheinlich übereifrigen Ursprungsschutz von Chrome. 

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

1
Myrne Stol
0

Ich sage Ihnen, was auf Safari (WebKit) für mich behoben wurde: Wenn ich die JS-Callback-Routine tatsächlich auf der Seite setze, dann bekomme ich volle Informationen. Wenn ich es über ein Tag in eine .js-Datei einbinde, erhalte ich nur den Fehler "Skriptfehler" (ohne Leinennummer usw.).

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

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

0
kbern