6

Web アプリケーションで Google がホストする jQuery を使用しています (//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js)ローカルでキャッチしていないエラーをサーバーに知らせます。

これまでのところは順調ですが... 時々、次のようなエラーが発生します。

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

これらの場合、Google CDN は (何らかの理由で) ブロックされていると思います。私はjQueryのローカルフォールバックを持っていますが、うまく機能していると確信していますが、何が返されているかを調べて、仮定をテストし、これらのユーザーの一部をGoogle CDNのホワイトリストに登録できるようにしたいと考えています(会社のファイアウォールがブロックしている場合)。

しかし、これまでのところ、返されたコンテンツを取得する方法を理解できていません。ファイルの場合、SCRIPT タグの innerText を取得できない、クロスドメイン ポリシーが原因で ajax リクエストを実行できない、など。

これがどのように可能になるかについて誰か考えがありますか?

4

1 に答える 1

12

<script>タグによって参照されるファイルのコンテンツを取得することは、まったく不可能です。これには正当な理由があります。そうすると、XHR の同一生成元ポリシーを回避できるようになります。

検討:

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

応答のテキストにアクセスできれば、次のことができます。

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

それは明らかに悪いことです。<script>したがって、タグによって持ち込まれたものの内容を読み取ることはできません。

特定の状況は、クロスオリジン スクリプトのエラーがページのハンドラーに有用な情報を報告しないという比較的最近導入された変更によって複雑になっています。(基本的に、これは、悪意のあるサイトが、特に有名なサイトにログインしているかどうかを推測できるようにする、情報漏えいのセキュリティ ホールにパッチを当てるために行われました。)onerror

これは、CDN でホストされたスクリプトからエラーに関する有益な情報が得られないことを意味するため、CDN (または他の同一オリジンではない) サーバーでCORSを使用してオプトインし、完全なエラーの詳細を渡すことができるようにするために、別の変更が加えられました。ハンドラーに。onerror

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

この「機能」は、実環境 (Firefox および Webkit ブラウザー) で十分に広く採用されているため、本番環境で見られるキャッチされない例外の大部分には、アクション可能な情報が含まれていません。

crossorigin属性(元々はを対象としていました<img>) を使用すると、リソースに CORS ルールをロードする必要があることを指定できます。Mozilla、WebKit、およびChromeで実装されています。

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

残念ながら、私のテストでは、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

...

Origin要求にヘッダーが存在する (CORS 要求を示す) こととAccess-Control-Allow-Origin、応答にヘッダーがないことに注意してください。したがって、crossorigin属性を配置しても、CORS チェックは失敗し、スクリプトはスクラブされたエラーの詳細を受け取ります。

Google CDN サーバーで CORS を有効にするための3 年前の問題があります。私は息を止めませんでした。


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

于 2013-01-04T22:07:56.990 に答える