내 웹 사이트에서 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 %에서 발생하며보고 된 오류의 절반을 나타냅니다.
답변
“스크립트 오류” 예외가 브라우저의 동일한 출처 정책을 위반하는 경우 (예 : 현재 페이지의 도메인 이외의 도메인에서 호스팅되는 스크립트에서 오류가 발생하는 경우) 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 응답 헤더를 보내도록하여 일부 브라우저에서 전체 도메인 간 오류보고를 활성화 할 수 있습니다 .
답변
앞으로이 질문에 걸려 넘어 질 사람들을위한 업데이트 : 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/
답변
이것은 알아내는 데 약간의 시간이 걸렸습니다.
우리는 그것을 시도하고 해결하기 위해 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에서 영어 이외의 모드로 작성 중이며 맞춤법 검사기가 영어로 설정되어 있지 않습니다.) 다시 전환 할 시간입니다.
즐겨!
답변
%가 낮아 일반 사용자가 아니라고 가정 할 수 있습니다. 아마도 사용자 스크립트, 북마크 또는 사용자 웹 사이트의 콘솔을 어지럽히는 사용자 일 수 있습니다. 페이지의 전체 HTML이 있으면이 이론을 테스트하는 데 도움이 될 수 있습니다. 완전한 오류뿐만 아니라. 그것은 당신에게 URL을 제공해야합니다, 항상 동일합니까? 줄이 실제로 0입니까 아니면 정의되지 않았습니까?
나는 onerror에서 기본값을 설정하는 것이 좋은 생각이라고 생각하지 않으며 0 parseInt(ln || 0)
은 실제로 오류가 페이지에 없을 때 발생합니다 (위의 예 참조).
자바 스크립트에서 해당 오류를 무시하기 위해 줄을 알 수 있는지 (자신의 코드에서 나오지 않았기 때문에) 또는 서버 측 코드에서 줄을 알 수 있도록 if를 추가하면 개별적으로 처리 할 수 있습니다. .
=== 편집 === 다음으로 이동 :
http://www.xavierm02.net/AZE/
user.js 파일을 설치하십시오 (Chrome에서는했지만 Firefox에서도 작동합니다). 그런 다음 동일한 브라우저에서 html 페이지를여십시오. 그것은 당신에게 오류를 보여줄 것입니다 (서버에보고하는 도둑질 만 변경하고 페이지에 씁니다). 행 번호로 0을 사용합니다.
답변
비슷한 문제가 있습니다. 스크립트는 하위 도메인에서 제공되며 동일한 원본 제한에 속합니다. 그러나 나는 이것을 해결했다.
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 세부 정보에 대해서는 매우 적습니다.
답변
Chrome에서 HTML 및 Javascript를 모두로드 할 때 “스크립트 오류”(0 행)가 표시됩니다 file://
. Firefox에서는 발생하지 않습니다. 아마도 Chrome을 지나치게 과도하게 동일하게 보호합니다.
HTTP를 통해 동일한 HTML 및 Javascript를로드 할 때 좋습니다.
답변
아래는 어떻습니까. 스크립트 오류는 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;
};