암호 "스크립트 오류" Chrome 및 Firefox에서 Javascript로보고


199

내 웹 사이트에서 Javascript 오류를 감지하여보고를 위해 백엔드로 보내는 스크립트가 있습니다. 발생한 첫 번째 오류, 예상 줄 번호 및 시간을보고합니다.

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>

이 스크립트로 인해 내 사이트에서 발생하는 자바 스크립트 오류를 ​​심각하게 알고 있습니다. 가장 큰 범죄자 중 하나는 "스크립트 오류"입니다. 라인 0에 Chrome 10 이상, 파이어 폭스 3+있다. 이 오류는 Internet Explorer에 존재하지 않거나 다른 이름으로 불릴 수 있습니다.

수정 (2013 년 5 월 23 일) : 이 "스크립트 오류, 줄 0"오류가 이제 IE7 및 다른 버전의 IE에 표시됩니다. 이 동작은 이전에는 존재하지 않았으므로 최근 IE 보안 패치의 결과 일 수 있습니다.

이 오류의 의미 또는 원인을 아는 사람이 있습니까? 전체 페이지로드의 약 0.25 %에서 발생하며보고 된 오류의 절반을 나타냅니다.


당신의 독 타입은 무엇입니까? XHTML doctype을 선언하지 않으면 CDATA가 필요하지 않으므로 스크립트 오류가 발생할 수 있습니다.
James

도움을 주셔서 감사합니다 ... doctype : XHTML을 추가했습니다. 또한 페이지로드의 0.25 %에서만 발생합니다 ... 더 이국적인 것으로 생각합니다.
Mike Sherov

3
@ jayp : 그냥 언급. XHTML doctype은 여전히 ​​HTML 파서입니다. application/xhtml+xmlXHTML 파서 (XHTML 사양과 같이)에서 실행할 내용을 보내야합니다 . XHTML이라고 주장하지만 일반적인 HTML doctype을 보내는 많은 내용이 있습니다. 콘텐츠 제작자가 XHTML을 잘못 사용하는 방식 때문에 브라우저는 XML 파서 만 사용하기로 결정했습니다 application/xhtml+xml(실제로 엄격한 파서). hixie.ch/advocacy/xhtmlwebdevout.net/articles/beware-of-xhtml는 XHTML과 HTML 파서를 사용하지 이유를 말한다.
Konrad Borowski

11
한숨 ..이 책을 읽는 사람, 신의 사랑을 위해 , 오류 메시지가 정확히 무엇이 잘못되었는지 설명 하십시오 ! 작성하는 데 30 초의 노력을 아끼면 세계인이 낭비하게됩니다!
Roman Starkov

1
오류 스크립트로드 오류를 무시하고 있습니다. 왜? 그들은 무시해도 안전합니까?
ramper

답변:


261

"스크립트 오류" 예외가 브라우저의 동일한 출처 정책을 위반하는 경우 (예 : 현재 페이지의 도메인 이외의 도메인에서 호스팅되는 스크립트에서 오류가 발생하는 경우) Firefox, Safari 및 Chrome 에서 발생합니다.

이 동작은 스크립트가 외부 도메인으로 정보를 유출하는 것을 방지하기위한 것입니다. 이것이 왜 필요한지에 대한 예를 들어, 실수로 방문 evilsite.com하여 페이지를 제공 한다고 상상해보십시오 <script src="yourbank.com/index.html">. (예, 우리는 JS가 아닌 html로 스크립트 태그를 가리키고 있습니다). 이로 인해 스크립트 오류가 발생하지만 로그인 여부를 알려줄 수 있으므로 흥미 롭습니다. 로그인 한 경우 오류 일 수 'Welcome Fred...' is undefined있지만 그렇지 않은 경우 오류 일 수 있습니다 'Please Login ...' is undefined. 그 라인을 따라 뭔가.

evilsite.com이 상위 20 개 정도의 은행 기관에서이 작업을 수행하면 방문한 은행 사이트에 대해 잘 알고 있으며 훨씬 더 표적화 된 피싱 페이지를 제공 할 수 있습니다. (물론 이것은 단지 하나의 예이다. 그러나 브라우저가 허용해서는 안 왜 보여 어떤 도메인 간 경계에 데이터를.)

최신 버전의 Safari, Chrome 및 Firefox에서이 기능을 테스트했습니다. 모두이 작업을 수행합니다. IE9는 그렇지 않습니다. x- 원점 예외를 동일한 원점 예외와 동일하게 취급합니다. (그리고 Opera는 오류시 지원하지 않습니다.)

말 입에서 : onerror ()에 예외를 전달할 때 원점을 확인하는 WebKit 소스 . 그리고 확인하는 Firefox 소스 .

업데이트 (10/21/11) : 이 문제를 추적 하는 Firefox 버그 에는이 동작에 영향을주는 블로그 게시물에 대한 링크가 포함되어 있습니다.

업데이트 (12/2/14) : 이제 스크립트 태그에 crossorigin속성 을 지정 하고 서버가 적절한 CORS HTTP 응답 헤더를 보내도록하여 일부 브라우저에서 전체 도메인 간 오류보고를 활성화 할 수 있습니다 .


3
고마워 약간의 설명이 필요합니다. 내 페이지에 항상 포함하는 스크립트의 자세한 오류 메시지가 표시됩니다. 예를 들어, Google의 CDN에서 jQuery를 포함하고이를 사용하여 내 페이지의 존재하지 않는 요소를 조작하면 Google의 CDN을 가리키는 오류가 발생합니다. "스크립트 오류"라고 말하고 있습니까? 원격 스크립트에서 예외가 발생하여 발생합니까?
Mike Sherov

150
? 당신은 생각 누군가가 어 ..., 대신 당신은 무엇이 잘못되었는지 궁금 휴가의 "원격 스크립트 때문에 동일 출처 정책에 숨겨진 오류가 발생했습니다"말을 의미했을 것이다 것
로마 Starkov

3
@broofa 이것은 Google의 CDN을 사용하는 대신 도메인에서 jquery를 호스팅하면 더 나은 서비스를 제공한다는 것을 의미합니까?
Paul Biggar

6
작은 업데이트. 또한 페이지가 file : //을 통해로드되고 스크립트가 eval ()을 통해 실행될 때 로컬에서 발생합니다. 경미한 유스 케이스이지만 여전히 :)
Willem Mulder

6
조사 후 Script Error.사용자가 JavaScript 코드를 주입하는 Safari 확장 (Firefox 플러그인과 동일)을 설치 한 경우에도 오류가 발생합니다.
Alex Hoppen

49

앞으로이 질문에 걸려 넘어 질 사람들을위한 업데이트 : broofa가 정답이며 이에 대한 해결 방법은 없습니다.

분명히 다른 것은이 제한에 빠졌고 수정을 요청하는 일부 버그가 Firefox : Bug 69301 및 WebKit : Bug 70574에 제기되었습니다.

좋은 소식은 Firefox 13 릴리스에서 Firefox에 대한 버그가 해결되었다는 것입니다.

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

crossorigin은 자격 증명을 보내지 않고 스크립트의 CORS 페치crossorigin=anonymous수행 하도록 브라우저에 지시합니다 .

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/



1
다시 웹킷. 당신이 하나를 의미하는 경우 지금 해결 것처럼, 그것은 같습니다 bugs.webkit.org/show_bug.cgi?id=70574
UpTheCreek

3
외부 사이트의 JS 파일 (예 : API 제공자의 서버 apiprovider.com/api.js)을 포함하는 mysite.com/index.php에서 JS 오류를 모니터링하려고한다고 가정합니다. 이 경우 해당 서버에 액세스 할 수 없으므로 "Access-Control-Allow-Origin"헤더를 추가 할 수 없습니다. api.js에서 발생한 오류 메시지를 얻는 방법이 있습니까?
Eugenio

23

이것은 알아내는 데 약간의 시간이 걸렸습니다.

우리는 그것을 시도하고 해결하기 위해 Ajax를 통해 WHOLE 문서 본문을 서버에 다시 덤프하는 것과 같은 일을 포함하여 그것을 시도하고 해결하기 위해 많은 일을했습니다.

"스크립트 오류"의 원인을 여전히 잘 모르겠습니다. Firefox에서는 (BTW 기간이 Ajax 로거에 표시되는 방식입니다) Chrome에서는 Chrome의 범위를 좁힐 수있었습니다.

드럼 롤 ...

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에서 영어 이외의 모드로 작성 중이며 맞춤법 검사기가 영어로 설정되어 있지 않습니다.) 다시 전환 할 시간입니다.

즐겨!


4
직접적인 이유는 아마도 번역기 스크립트가 웹 페이지가 아닌 다른 도메인에서 실행 되었기 때문일 것입니다 onerror(적어도 Firefox에서는).
Tgr

10

%가 낮아 일반 사용자가 아니라고 가정 할 수 있습니다. 아마도 사용자 스크립트, 북마크 또는 사용자 웹 사이트의 콘솔을 어지럽히는 사용자 일 수 있습니다. 페이지의 전체 HTML이 있으면이 이론을 테스트하는 데 도움이 될 수 있습니다. 완전한 오류뿐만 아니라. 그것은 당신에게 URL을 제공해야합니다, 항상 동일합니까? 줄이 실제로 0입니까 아니면 정의되지 않았습니까?

나는 onerror에서 기본값을 설정하는 것이 좋은 생각이라고 생각하지 않으며 0 parseInt(ln || 0)은 실제로 오류가 페이지에 없을 때 발생합니다 (위의 예 참조).

자바 스크립트에서 해당 오류를 무시하기 위해 줄을 알 수 있는지 (자신의 코드에서 나오지 않았기 때문에) 또는 서버 측 코드에서 줄을 알 수 있도록 if를 추가하면 개별적으로 처리 할 수 ​​있습니다. .

=== 편집 === 다음으로 이동 : http://www.xavierm02.net/AZE/ user.js 파일을 설치하십시오 (Chrome에서는했지만 Firefox에서도 작동합니다). 그런 다음 동일한 브라우저에서 html 페이지를여십시오. 그것은 당신에게 오류를 보여줄 것입니다 (서버에보고하는 도둑질 만 변경하고 페이지에 씁니다). 행 번호로 0을 사용합니다.


URL은 내 사이트의 페이지에 균등하게 분배됩니다. FF와 크롬을 고려하면 북마크 또는 확장 프로그램 또는 테마도 추측하고 있습니다. 그러나 안전하게 무시하기 전에이 오류 메시지를 정확하게 재현 할 수 있기를 바랍니다.
Mike Sherov

줄을 (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());바꾸면 URL이 표시되지 않습니다 (확장자이거나 로컬이므로 브라우저에 표시되지 않기 때문에).
xavierm02

그리고 btw, JS가 아닌 서버로 타임 스탬프를 가져와야합니다 (타임 스탬프 대신 버전을 가져 오는 것조차 가능합니다).
xavierm02

1
실제로 JS는 원시 데이터 만 보내야하며 PHP는로드 오류 등을 무시해야합니다.
xavierm02

FIRST 관련 오류 만보 고 싶기 때문에 JS 측에서 일부 처리를 수행하므로 실제 오류가 발생한 후 onerror 함수를 다시 할당하지 않습니다. 또한 루프에서 발생하는 오류가 서버에서 ddos를 수행하지 못하게합니다. .
Mike Sherov

3

비슷한 문제가 있습니다. 스크립트는 하위 도메인에서 제공되며 동일한 원본 제한에 속합니다. 그러나 나는 이것을 해결했다.

1) 다음과 같이 모든 스크립트 태그를 추가하십시오.

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

2) 모든 호스트 내부에 다음을 추가하여 아파치 httpd.conf 수정 (mod_headers를 활성화해야 함) :

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

도움이 되었기를 바랍니다 ...

편집하다

내 서버 중 하나에서 교체를 제외 하고는이 기능을 수행 할 수 없었습니다.

*.mydomain.tld

으로

*

확장 된 정보를 피싱 할 수있는 결함에주의하십시오. CORS, same-origin, img & fonts, cdn에 대한 문서는 사용 가능하지만 스크립트 태그 crossorigin 세부 정보에 대해서는 매우 적습니다.


1
"* .mydomain.tld"는 crossorigin 속성 developer.mozilla.org/en-US/docs/Web/HTML/…에
icenac

1

Chrome에서 HTML 및 Javascript를 모두로드 할 때 "스크립트 오류"(0 행)가 표시됩니다 file://. Firefox에서는 발생하지 않습니다. 아마도 Chrome을 지나치게 과도하게 동일하게 보호합니다.

HTTP를 통해 동일한 HTML 및 Javascript를로드 할 때 좋습니다.


1

아래는 어떻습니까. 스크립트 오류는 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;
};

업장에 어떻게 기록합니까?
CommonSenseCode

브라우저 콘솔에 세부 정보가 있지만 onerror가 아니라고 말하고 있습니까?
Michael Freidgeim


0

iOS의 Chrome 및 Firefox는 모두 Safari Webview를 기반으로하지만로드 된 각 페이지에 여러 가지 사용자 정의 스크립트를 삽입합니다. 이러한 스크립트 중 하나에서 무언가 잘못되면 s도보고 Script error on line 0됩니다. (브라우저 삽입 스크립트는 교차 원점으로 계산)

이 다른 SO 스레드 에서 추적하고 문서화 한 것처럼 iOS의 Chrome과 Firefox 모두 SVG 요소를 올바르게 처리하는 사용자 정의 스크립트에 문제가 있습니다. 따라서이 스레드의 다른 모든 답변 외에도 페이지의 <a>태그 안에 SVG 요소 및 태그 를 사용하면 iOS Chrome 및 iOS Firefox에서보고됩니다.<svg>Script errors


-1

Safari (WebKit)에서 나를 위해 무엇을 고쳤는지 말해 줄 것입니다 : 실제로 JS 콜백 루틴을 페이지에 넣으면 전체 정보를 얻습니다. 태그를 통해 .js 파일에 포함하면 "스크립트 오류"오류가 발생합니다 (줄 번호 등이 없음).

어쩌면 이것은 Broofa의 말과 관련이 있습니다.

Anwyay, 이제 페이지에 작은 콜백이 있고 페이지 외부의 나머지 파일이 있습니다.


-2

약간의 검색을 수행 한 결과 "스크립트 오류"는 파일을로드하도록 요청하는 데 문제가 있음을 나타냅니다. 이는 클라이언트 측의 캐싱 문제이거나 과부하로 인한 서버 문제 일 수 있습니다.

스크립트 자체가로드 할 수없는 파일 인 0과 같은 오류가 발생했을 가능성이 높습니다.

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

좋은 생각이지만 스크립트를로드하지 못하면 명시 적으로 무시합니다. 해당 오류를 구체적으로 감지하여 무시했습니다.
Mike Sherov

1
스크립트를로드하지 못한 경우 어떻게 감지 했습니까? 한 시점에서 문제가 발생한 것을 기억합니다. script.onerror일부 브라우저에서 누락 된 스크립트로 인해 해고되지 않았습니다.
Charlie Kilian

"소스 오류." (little-e)는 웹킷과 FF 소스 모두에 나타납니다. 위의 답변을 참조하십시오. 멍청이.
broofa

-3

나는 경험했다

스크립트 오류. 라인 0

고객 브라우저에서 오류가 발생하면 Google 서버에 일정 시간 동안 오류가보고됩니다. 어제 처음으로 ( "use strict";자바 스크립트에 도입 한 후 ) Windows 7의 Safari 및 Chrome에서이 문제를 복제 할 수있었습니다. alert () 문으로 코드를 어지럽 힌 후 정의되지 않은 변수를 사용하여이 오류를 추적했습니다! 예를 들어 xx = 123;, xxvar명령문으로 정의되지 않습니다 .

Safari는 이것을 다음과 같이보고했습니다.

ReferenceError : 엄격 모드는 전역 속성 'xx'의 암시 적 생성을 금지합니다.

Web Inspector 내에서 window.onerror 함수가 감지했습니다

스크립트 오류. 라인 0


-11

Firefox의 소스 코드를 파악하면이 없다는 것을 알 수 있습니다 "Script Error.". 따라서 사이트의 일부 스크립트에서 다음과 같이 잡히지 않는 오류가 발생했을 가능성이 큽니다.

throw new Error('Script Error.');

아마도이 진술은 Firefox와 Chrome에서만 가능합니다.

그래도 줄 번호가없는 이유를 모르겠습니다. 어쩌면 어떤 eval()문제가 있습니까?


1
나는 당신이 권장 한대로 이것을 정확하게 던졌습니다. "스크립트 오류"를보고하지 않습니다. "Throw Exception not caught : Script Error."가보고됩니다. 그래도 좋은 생각입니다.
Mike Sherov

또한 사용자가 설치 한 확장 중 하나가 오류의 원인 일 수 있습니다.
Charlie Kilian

1
절대 안돼. 올바른 장소를 보면 웹 전체에 "스크립트 오류"가 표시됩니다.
Amalgovinus

2
아뇨 실제로는 "스크립트 오류"입니다. 작은 "e"와 함께. 그렇기 때문에 소스 코드에서 찾지 못했습니다.
user123444555621
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.