<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 を同じオリジンでホストする必要があります。