2013-01-02 3 views
6

webapp (//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js)에서 Google 호스팅 jQuery를 사용하고 있습니다. 버그 진단의 일환으로 나는 로컬에서 잡히지 않는 에러를 잡아 내고 서버가 그것에 대해 알도록 해주는 window.onerror 핸들러를 가지고있다. 이와 같은원격 스크립트 차단시 반환되는 내용 확인 방법

지금까지 너무 좋아하지만 ... 때로는 내가 얻을 오류 :

. "스크립트 오류", "오류로드 스크립트", "예기치 않은 토큰 <"

내 어떤 이유로 든 Google CDN이 차단 된 것으로 가정합니다. 나는 jQuery를위한 로컬 폴백을하고 있는데, 나는 꽤 잘하고 있다고 확신한다. 그러나 나는 내 가정을 테스트 할 수 있고, 구글의 CDN을위한 화이트리스트에서 이러한 사용자 중 일부를 얻을 수 있도록 리턴되는 것을 찾고 싶다. (회사 방화벽이 방화벽을 차단하는 경우).

하지만 지금까지 반환 된 콘텐츠를 검색하는 방법을 알아낼 수 없었습니다. 파일 인 경우 SCRIPT 태그의 innerText를 검색 할 수 없으며 도메인 간 정책으로 인해 Ajax 요청을 수행 할 수 없습니다.

누구에게 이것이 가능할 지에 대한 아이디어가 있습니까?

답변

11

<script> 태그가 참조하는 파일의 내용을 가져올 수 없습니다. 이는 합당한 이유가 있습니다. 그렇게하면 XHR의 동일 출처 정책을 우회 할 수 있습니다.

고려 : 당신이 respnse의 텍스트를 액세스 할 수있는 경우

<script src="https://www.example.com/private/api/getAuthToken" id="s"></script> 

, 당신은이 작업을 수행 할 수있을 것입니다 : 분명히 나쁜

var stolenAuthToken = $('#s').text(); 

합니다. 따라서 <script> 태그로 가져온 콘텐츠를 읽을 수 없습니다. 출처 간 스크립트 오류이 페이지의 onerror 핸들러에 어떤 유용한 정보를보고하지 않는 경우

특정 상황은 비교적 최근에 change 도입 복잡하다. 악의적 인 사이트가 사용자가 잘 알려진 사이트에 로그인했는지 여부를 추측 할 수있는 정보 유출 보안 구멍을 패치하기 위해 수행되었습니다.

즉, 유용한 정보를 얻지 못합니다. CDN 호스트 스크립트의 오류에 대해서는 이므로 CORS을 사용하여 CDN (또는 기타 동일하지 않은 출처가 아닌) 서버가 onerror 처리기로 전체 오류 세부 사항을 전달하도록 허용하도록 허용했습니다.

우리는 (페이스 북) #363897에 구현 된 window.onerror 음소거 행동을하지 않도록하는 메커니즘이 필요합니다. 정적 스크립트 리소스는 메인 사이트와 다른 도메인의 CDN에서 제공됩니다. 이러한 도메인이 다르기 때문에 우리는 브라우저 오류에 대한 유용한 정보를 수집하지 못하게하는 x-domain 로직에 취약합니다.

이 "기능"은 야생에서 (Firefox 및 Webkit 브라우저에서) 널리 채택되어 현재 프로덕션에서 볼 수있는 대부분의 잡히지 않은 예외에는 실제 정보가 없습니다.

crossorigin attribute (원래 <img>위한)

는 자원이 CORS 규칙을로드하도록 지정할 수 있습니다. Mozilla, WebKitChrome에서 구현되었습니다. 내 testing에서 불행하게도 당신을 위해

<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script> 

는, 나는 구글 CDN은 하지는 CORS 헤더를 전송한다는 것을 발견했다.

GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js HTTP/1.1 
Host: ajax.googleapis.com 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0 
Accept: */* 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: http://fiddle.jshell.net/josh3736/jm2JU/show/ 
Origin: http://fiddle.jshell.net 
Pragma: no-cache 
Cache-Control: no-cache 

HTTP/1.1 200 OK 
Vary: Accept-Encoding 
Content-Type: text/javascript; charset=UTF-8 
Last-Modified: Tue, 13 Nov 2012 19:53:02 GMT 
Date: Wed, 02 Jan 2013 22:54:25 GMT 
Expires: Thu, 02 Jan 2014 22:54:25 GMT 
X-Content-Type-Options: nosniff 
Server: sffe 
Content-Length: 93637 
X-XSS-Protection: 1; mode=block 
Cache-Control: public, max-age=31536000 
Age: 169036 

... 

주 (a CORS 요구를 나타내는) 요청의 Origin 헤더의 유무 및 응답하여 Access-Control-Allow-Origin 헤더의 부재. 따라서 crossorigin 속성을 넣더라도 CORS 검사가 실패하고 스크립트에 오류가 자세히 표시됩니다.

Google CDN 서버에서 CORS를 사용하려면 three-year-old issue이 있어야합니다. 나는 숨을 참지 않을 것이다.


tldr : 당신이 의미있는 오류 메시지를 원하는 경우 동일한 기원에 모든 자바 스크립트 자신을 개최한다.

+0

내가 생각한 것. 영향을받는 사용자와 직접 조사 할 수 있는지 확인합니다. 감사. – Pyro979

+0

이렇게 자세하고 우수한 게시물! – potench