2013-01-02 6 views
6

webapp(//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js)でGoogleがホストしているjQueryを使用しています。バグ診断の一環として、私はローカルにキャッチしていないエラーをキャッチし、サーバーに知らせるwindow.onerrorハンドラを持っています。リモートスクリプトがブロックされたときに返される内容を確認する方法

これまでのところは良い、しかし...時々私はこれらのようなエラーが発生します:

"スクリプトエラー"、 "読み込みエラースクリプト"、 "予期しないトークン<"

マイGoogleのCDNは(何らかの理由で)これらのケースでブロックされているという前提があります。私はjQueryのローカルフォールバックを持っていますが、私はかなりうまくいきますが、私は自分の前提をテストして、これらのユーザーの一部をGoogleの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でホストされたスクリプトのエラーについてはanother changeとなり、CORSを使用して、CDN(または他の非同一起源)サーバーでonerrorハンドラに完全なエラーの詳細を渡すことができます。

たち(Facebookは)#363897で実装window.onerrorミュート動作を無効にするためのメカニズムが必要です。私たちの静的スクリプトリソースは、メインサイトとは異なるドメインのCDN上で提供されます。これらのドメインが異なるため、xドメインのロジックに惑わされ、ブラウザのエラーに関する有用な情報を収集できなくなります。

この「機能」は、野生(FirefoxおよびWebkitブラウザ)で広く採用されており、現在生産中に見られる大部分の未知の例外には、実行可能な情報がありません。

(もともと <img>ためのもの)

crossorigin attributeは、リソースがCORSルールをロードするように指定することができます。 Mozilla、WebKit、およびChromeによって実装されています。あなたのために残念ながら

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

、私のtestingに、私はGoogleの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 

... 

注(CORS要求を示す)要求にOriginヘッダの存在に応答してAccess-Control-Allow-Originヘッダが存在しません。したがって、crossorigin属性を指定しても、CORSチェックは失敗し、スクラブされたエラーの詳細がスクリプトに送られます。

Google CDNサーバーでCORSを有効にするには、three-year-old issueがあります。私は息を止めないだろう。


tldr:あなたは意味のあるエラーメッセージが必要な場合は、同じ起源に、すべてのJavaScriptを自分でホストする必要があります。

+0

ちょっとわかりました。影響を受けるユーザーと直接調査できるかどうかがわかります。ありがとう。 – Pyro979

+0

詳細、優れた投稿! – potench

関連する問題