224 votes

Cryptique « Script Error. » signalés en Javascript dans Chrome et Firefox

J'ai un script qui détecte les erreurs Javascript sur mon site web et les envoie à mon backend pour les rapports. Il rapporte la première erreur rencontrée, la supposée numéro de ligne, et le temps.

MODIFIER pour inclure 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>

En raison de ce script, j'ai pleinement conscience de toutes les erreurs javascript qui se passe sur mon site. L'un de plus grands délinquants "Erreur de Script." sur la ligne 0. dans google Chrome 10+, Firefox 3+. Cette erreur n'existe pas (ou peut être appelé quelque chose d'autre?) dans Internet Explorer.

Correction (5/23/2013): Cette "Erreur de Script, la Ligne 0" erreur apparaît maintenant dans IE7 et peut-être d'autres versions de IE. Éventuellement, un résultat d'une récente IE correctif de sécurité que ce comportement n'existaient pas auparavant.

Quelqu'un aurait-il une idée de ce que cette erreur signifie ou ce qui les provoque? Il arrive à environ 0,25% de l'ensemble de mon pageloads, et représente la moitié du nombre des erreurs.

286voto

broofa Points 21663

L'erreur de Script"." se passe dans Firefox, Safari et Chrome lorsqu'une exception viole le navigateur de la même origine " de la politique - c'est à dire lorsque l'erreur se produit dans un script qui est hébergé sur un domaine autre que le domaine de la page en cours.

Ce comportement est intentionnel, pour éviter des scripts à partir de la fuite de l'information à des domaines externes. Pour un exemple de pourquoi cela est nécessaire, imaginez accidentellement visitant evilsite.com, qui sert une page avec des <script src="yourbank.com/index.html">. (oui, nous sommes en soulignant que balise de script html, pas de JS). Il en résultera une erreur de script, mais l'erreur est intéressant parce qu'il peut nous dire si vous êtes connecté ou non. Si vous êtes connecté, l'erreur peut être 'Welcome Fred...' is undefined, alors que, si vous n'êtes pas, il pourrait être 'Please Login ...' is undefined. Quelque chose le long de ces lignes.

Si evilsite.com le fait pour le top 20 ou si les institutions bancaires, ils ont une assez bonne idée de ce qui banking sites que vous visitez, et pourrait donner un beaucoup plus ciblée page d'hameçonnage. (Ceci est juste un exemple, bien sûr. Mais cela explique pourquoi les navigateurs ne devriez pas permettre à toutes les données de franchir les limites du domaine.)

J'ai testé cela dans les dernières versions de Safari, Chrome et Firefox - ils tous faire cela. IE9 ne fonctionne pas - il traite les x-origine exceptions près, les mêmes que d'origine. (Et Opera ne supporte pas onerror.)

Des chevaux à la bouche: WebKit source qui vérifie l'origine lors du passage des exceptions à onerror(). Et la source de Firefox qui vérifie.

Mise à JOUR: Le bug Firefox qui suit cette question inclut un lien vers le blog qui a inspiré ce comportement.

54voto

adig Points 2102

Une mise à jour pour ceux qui tombent dans cette question dans l'avenir : broofa est à droite avec la réponse et il n'y a aucune solution de contournement pour ce.

Évidemment, d'autres ont trébuché sur cette limitation et quelques bugs demandant une correction ont été déposées pour Firefox : Bug 69301 et pour WebKit : Bug 70574

La bonne nouvelle, c'est que le bug a été résolu pour Firefox avec la sortie de Firefox 13. C'est la façon dont vous l'utiliser :

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

crossorigin est équivalent à crossorigin=anonymous et indique au navigateur de faire de la SCRO chercher du script sans l'envoi d'informations d'identification.

Vous devez vous assurer que le script est envoyé avec un Access-Control-Allow-Origin - tête HTTP de la valeur qui correspond à la partie requérante de domaine, par exemple,

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

sinon, le navigateur va annuler le chargement du script.

Pour Apache:

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

(Et voir la SCRO exemples pour d'autres serveurs web.)

Si vous envoyez des scripts en PHP:

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

Je l'ai testé et il fonctionne comme prévu. toutes les erreurs de la script.js seront pris par l' window.onerror gestionnaire du message, le fichier et la ligne de détails.

Le WebKit bug n'a pas été encore fixée, mais un patch a été proposé (et utilise la même solution). J'espère que le correctif sera publié prochainement.

Plus d'infos sur la SCRO ici : http://enable-cors.org/

29voto

anonymous-one Points 2113

Cette une a fallu un peu de comprendre.

Nous avons fait un tas de trucs à essayer de le résoudre, y compris des choses comme le dumping, l'ENSEMBLE du corps du document à nos serveurs via ajax pour essayer de le comprendre.

Je suis toujours pas sûr de ce qui provoque des Erreur de Script"." (btw, c'est qu'il s'affiche dans nos ajax logger) dans firefox, mais dans chrome, nous avons été en mesure de réduire à la...

Roulement de tambour...

L'auto translate fonctionnalité de google chrome.

Beaucoup de personnes parlant anglais probablement ne savent même pas sur cette fonctionnalité, mais pour tester, je suppose visiter un non anglais site en utilisant google chrome. Ou mieux encore, si vous creusez à travers le chrome options theres un endroit pour changer la langue du navigateur. De le changer pour quelque chose de non anglais, redémarrez le navigateur, et de visiter un site en anglais.

Vous devriez obtenir la barre jusqu'à vous demander si vous souhaitez chrome pour transalte la page pour vous.

Dans notre cas, de toute façon, le traducteur a été à l'origine du problème, car il injecte une balise script dans le corps du document et (deviner ici) utilise une sorte de js base de système pour envoyer le contenu de lunettes de serveurs et de les faire traduire.

Même quand l'erreur dans la console était Unrefreneced quelque chose, le message qui a été envoyé à la fenêtre.onerror a été "Erreur de Script.".

De toute façon, il ya un remède.

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

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

Cela va faire 2 choses (autant que nous le savons, peut-être plus?):

a) Désactiver la traduire de barre de poping up dans le navigateur chrome.

b) Désactiver la traduction de la page via transalte.google.com.

Dans notre situation, de toute façon, cela a résolu UNE TONNE de ces "Erreur de Script." les problèmes que nous rencontrions.

Excuse les fautes d'orthographe dans ce post, je suis toujours sur un non-anglais mode en chrome de la rédaction du présent et le correcteur orthographique n'est pas l'anglais ;) le Temps de revenir en arrière.

Profitez-en!

10voto

xavierm02 Points 2255

En raison de la faible %, vous pouvez supposer qu'ils ne sont pas les utilisateurs normaux. Probablement les utilisateurs avec des userscripts, favoris ou même peut-être juste de jouer avec la console sur votre site web. Avoir tout le code HTML d'une page où il se produit pourrait l'aider à tester cette théorie. Ainsi que l'erreur complet. Il devrait vous donner une url, est-il toujours le même? Est la ligne 0 ou tout simplement pas défini?

Je ne pense pas que le réglage des valeurs par défaut dans vous onerror est une bonne idée et l'0, vient probablement d' parseInt(ln || 0) lorsque l'erreur n'est pas vraiment sur la page (voir les exemples ci-dessus).

L'ajout d'un si pour voir si la ligne est connue dans le JavaScript pour ignorer ces erreurs (sans doute parce qu'ils ne viennent pas de votre propre code) ou dans le code côté serveur pour prendre soin d'eux séparément serait, de l'omi, être mieux.

=== EDIT === Ai: http://www.xavierm02.net/AZE/ Installer le user.js fichier (je l'ai fait sur Chrome, mais il devrait fonctionner sur Firefox aussi). Ensuite, ouvrez la page html sur le même navigateur. Il va vous montrer l'erreur (j'ai seulement changé que insteal de reporting pour le serveur, il l'écrit sur la page). Avec 0 comme numéro de ligne.

3voto

spoutnik Points 71

J'ai eu un problème similaire: mes scripts sont servis par un sous-domaine et relèvent de la même origine restriction. Cependant, j'ai résolu ce problème en:

1) ajout de chaque balise de script comme ceci:

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

2) modification de l'apache httpd.conf en ajoutant le texte suivant à l'intérieur de chaque serveur virtuel (vous devez enbable mod_headers):

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

Espérons que cela aide ...

MODIFIER

Sur un de mes serveur je n'ai pas pu faire de cette fonctionnelle, sauf en remplaçant

*.mydomain.tld

par

*

Être conscient des failles permettant potentiellement * phish informations étendues. Documentation sur la SCRO, de même origine, img et les polices, les ca est disponible, mais bien moins nombreux sur balise de script crossorigin de détails est disponible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X