Загадочная «Ошибка скрипта».сообщается в Javascript в Chrome и Firefox - PullRequest
195 голосов
/ 06 мая 2011

У меня есть скрипт, который обнаруживает ошибки Javascript на моем веб-сайте и отправляет их в мой бэкэнд для создания отчетов. Он сообщает о первой обнаруженной ошибке, предполагаемом номере строки и времени.

ИЗМЕНИТЬ, чтобы включить тип документа:

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

Из-за этого скрипта я хорошо осведомлен о любых ошибках javascript, которые происходят на моем сайте. Один из крупнейших нарушителей - «Ошибка сценария». в строке 0. в Chrome 10+ и Firefox 3+. Эта ошибка не существует (или может называться как-то еще?) В Internet Explorer.

Исправление (23.05.2013): Эта ошибка «Ошибка сценария, строка 0» теперь отображается в IE7 и, возможно, в других версиях IE. Возможно, это результат недавнего исправления безопасности IE, так как ранее такого поведения не было.

Кто-нибудь знает, что означает эта ошибка или что ее вызывает? Это происходит примерно на 0,25% моих общих загрузок страниц и составляет половину зарегистрированных ошибок.

Ответы [ 12 ]

249 голосов
/ 15 октября 2011

«Ошибка скрипта». происходит в Firefox, Safari и Chrome, когда исключение нарушает политику браузера с одинаковым происхождением , т. е. когда ошибка возникает в сценарии, размещенном в домене, отличном от домена текущей страницы.

Такое поведение является преднамеренным для предотвращения утечки информации скриптами во внешние домены. В качестве примера того, почему это необходимо, представьте себе случайное посещение evilsite.com, которое открывает страницу с <script src="yourbank.com/index.html">. (да, мы указываем этот тег сценария на HTML, а не на JS). Это приведет к ошибке скрипта, но эта ошибка интересна тем, что может сообщить нам, вошли вы в систему или нет. Если вы вошли в систему, ошибка может быть 'Welcome Fred...' is undefined, а если нет, то может быть 'Please Login ...' is undefined. Что-то в этом роде.

Если evilsite.com сделает это для 20 или около того банковских учреждений, у них будет довольно хорошее представление о том, какие банковские сайты вы посещаете, и они могут предоставить гораздо более целевую фишинговую страницу. (Конечно, это только один пример. Но он показывает, почему браузеры не должны позволять любым данным пересекать границы домена.)

Я проверял это в последних версиях Safari, Chrome и Firefox - все они делают это. IE9 этого не делает - он обрабатывает исключения x-origin так же, как исключения того же происхождения. (И Opera не поддерживает ошибку.)

Из уст лошадей: Источник WebKit, проверяющий источник при передаче исключений в onerror (). И источник Firefox, который проверяет .

ОБНОВЛЕНИЕ (21.10.11) : ошибка Firefox, которая отслеживает эту проблему включает ссылку на пост в блоге, который вдохновил на такое поведение.

ОБНОВЛЕНИЕ (12/2/14) : теперь вы можете включить полный междоменный отчет об ошибках в некоторых браузерах, указав атрибут crossorigin в тегах сценария и имея сервер отправляет соответствующие CORS HTTP-заголовки ответа.

49 голосов
/ 20 июня 2012

Обновление для тех, кто столкнется с этим вопросом в будущем: брофа прав с ответом, и для этого нет обходного пути.

Очевидно, что другие сталкивались с этим ограничением, и некоторые ошибки, запрашивающие исправление, были поданы для Firefox: Ошибка 69301 и для WebKit: Ошибка 70574

Хорошей новостью является то, что ошибка была исправлена ​​для Firefox с выпуском Firefox 13. Вот как вы его используете:

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

crossorigin эквивалентно crossorigin=anonymous и сообщает браузеру выполнить выборку CORS сценария без отправки учетных данных.

Необходимо убедиться, что сценарий отправляется со значением Access-Control-Allow-Origin заголовка HTTP, которое соответствует запрашивающему домену, например,

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

в противном случае браузер отменит загрузку скрипта .

Для Apache:

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

(и см. Примеры CORS для других веб-серверов.)

Если вы отправляете скрипты на PHP:

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

Я проверил это, и оно работает как положено.все ошибки из файла script.js будут перехвачены обработчиком window.onerror с подробным сообщением, файлом и строкой.

Ошибка WebKit еще не исправлена, но был предложен патч (и использует то же решение).Надеюсь, исправление будет выпущено в ближайшее время.

Подробнее о CORS здесь: http://enable -cors.org /

23 голосов
/ 10 сентября 2011

Этому потребовалось немало времени, чтобы понять.

Мы сделали кучу вещей, чтобы попытаться решить их, включая такие вещи, как сброс всего тела документа обратно на наши серверы через Ajax, чтобы попытаться выяснить это.

Я все еще не уверен, что вызывает "Ошибка сценария". (с периодом BTW, это то, как это проявляется в нашем Ajax-логгере) в Firefox, но в Chrome мы смогли сузить его до ...

Барабанная дробь ...

Функция автоматического перевода в Google Chrome.

Многие англоговорящие люди, вероятно, даже не знают об этой функции, но для ее тестирования, я думаю, посетите неанглоязычный сайт с помощью Chrome. Или, что еще лучше, если вы поковыряетесь в настройках Chrome, есть место для изменения языка браузера. Измените его на что-нибудь неанглийское, перезапустите браузер и посетите сайт на английском языке.

Вы должны получить панель вверху с вопросом, хотите ли вы, чтобы Chrome перевел страницу для вас.

В любом случае, в нашем случае переводчик вызывал проблему, так как он вставляет тег скрипта в тело документа и (догадываясь здесь) использует какую-то систему на основе JS для отправки контента на серверы Google и получения его для его перевода .

Несмотря на то, что ошибка в консоли была чем-то не связанным, сообщение, которое отправлялось в window.onerror, было «Ошибка сценария».

В любом случае, есть лекарство.

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

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

Это будет делать 2 вещи (насколько мы знаем, может быть, больше?):

a) Отключить переводчик в Chrome.

b) Отключить перевод страницы через translate.google.com.

В любом случае, в нашей ситуации это решило ДЕСЯТЬ из этих «Ошибка сценария». проблемы, с которыми мы столкнулись.

Извините за орфографические ошибки в этом посте, я все еще нахожусь на неанглийском режиме в Chrome, пишу это, а проверка орфографии не установлена ​​на английский;) Время переключиться обратно.

Наслаждайтесь!

10 голосов
/ 11 мая 2011

Из-за низкого% вы можете предположить, что они не обычные пользователи. Возможно, пользователи с пользовательскими скриптами, букмарклетами или даже просто возятся с консолью на вашем сайте. Наличие всего HTML страницы, где это происходит, может помочь проверить эту теорию. Как и полная ошибка. Это должно дать вам URL, это всегда то же самое? Строка действительно 0 или просто не определена?

Я не думаю, что установка значений по умолчанию в вашем файле onerror является хорошей идеей, и 0, вероятно, исходит от parseInt(ln || 0), когда ошибки на самом деле нет на странице (см. Примеры выше).

Добавление if, чтобы увидеть, известна ли строка либо в JavaScript, чтобы игнорировать эти ошибки (потому что они, вероятно, не исходят из вашего собственного кода), либо в коде на стороне сервера, чтобы обрабатывать их отдельно, imo , будь лучше.

=== РЕДАКТИРОВАТЬ === Должен: http://www.xavierm02.net/AZE/ Установите файл user.js (я сделал это на Chrome, но он должен работать и на Firefox). Затем откройте HTML-страницу в том же браузере. Он покажет вам ошибку (я только изменил этот отчет о сообщении на сервер, он пишет на странице). С 0 в качестве номера строки.

3 голосов
/ 05 августа 2012

У меня была похожая проблема: мои скрипты обслуживаются поддоменом и подпадают под то же ограничение происхождения. Однако я решил это следующим образом:

1) добавление каждого тега скрипта следующим образом:

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

2) изменение apache httpd.conf путем добавления следующего в каждый vhost (необходимо включить mod_headers):

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

Надеюсь, это поможет ...

EDIT

На одном из моих серверов я не смог сделать этот функционал, кроме как заменив

*.mydomain.tld

от

*

Помните о недостатках, которые могут позволить * фишировать расширенную информацию. Документация по CORS, одинакового происхождения, img & fonts, cdn доступна, но доступно очень мало подробностей о происхождении тега скрипта.

1 голос
/ 08 июня 2016

Хорошая статья, которая, наконец, указывает на эту тему. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/

1 голос
/ 31 мая 2016

Как насчет ниже. Ошибка сценария недоступна через JavaScript, поэтому просто выделите этот конкретный случай и обработайте его как можно лучше.

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 голос
/ 24 мая 2013

В Chrome я также получаю «Ошибка сценария» (в строке 0) при загрузке HTML и Javascript из file://. Этого не происходит в Firefox. Вероятно, чрезмерная защита Chrome того же происхождения.

Все хорошо при загрузке одного и того же HTML и Javascript через HTTP.

0 голосов
/ 11 февраля 2013

Я испытал

Ошибка скрипта. линия 0

ошибок в течение некоторого времени возвращалось на наш сервер, когда ошибка возникла в клиентских браузерах. Вчера впервые (после введения "use strict"; в нашем javascript) я смог повторить эту проблему в Safari и Chrome на Windows 7. После засорения нашего кода с помощью операторов alert () я отследил эту ошибку до использования неопределенного переменная! например xx = 123;, где xx не определено с оператором var.

Safari сообщил об этом как

ReferenceError: Строгий режим запрещает неявное создание глобального свойства 'xx'

внутри Web Inspector, но функция window.onerror обнаруживала

Ошибка скрипта. линия 0

0 голосов
/ 26 октября 2011

Я расскажу вам, что это исправило для меня в Safari (WebKit): если я на самом деле добавлю подпрограмму обратного вызова JS на страницу , то получу полную информацию.Если я включаю его в файл .js с помощью тега, я просто получаю сообщение об ошибке «Ошибка скрипта» (без указания номера белья и т.1006 * Anwyay, так что теперь у меня есть небольшой обратный вызов на странице, а затем остальная часть файла за пределами страницы.

...