2016-06-16 9 views
0

一部のWebサーバーでは、JSON応答の前に、while(1);というeを付けます。 g。 while(1);['id',123]ブラウザがコンテンツタイプjsonの<script>を実行するのはなぜですか?

これはJSON hijackingを防ぐためです:

これは、他のいくつかのサイトが あなたのデータを盗もうとする厄介なトリックを行うことができないようにすることです。たとえば、配列コンストラクタを置き換えて、このJSON URLをタグを使用して に置き換えると、悪意のある第三者の サイトがJSON応答からデータを盗み出す可能性があります。 (1)の間に を置くことによって;最初はスクリプトがハングします。

<!-- Content-type: application/json; charset=ISO-8859-1 --> 
 
<script src="http://code.jsontest.com/?mine=1"></script>

:webbrowsers(例:Firefox)は、コンテンツの種類 application/jsonでスクリプトを実行するため <script>ソースとしてJSONコンテンツの@bdonlan、 https://stackoverflow.com/a/871508/1647737

しかし、この '誤用は' のみ可能です

ブラウザはコンテンツタイプが一致しないリモートスクリプトを単に無視できません。 E.上記の例では、script typeapplication/javascript(デフォルト)ですが、responeのコンテンツタイプはapplication/jsonです。 JavaScriptとしてまだ実行されているのはなぜですか?

答えて

2

ブラウザは、content-typeの非常に寛容な傾向があります。 JavaScriptが初めて登場したときには、標準化されたcontent-typeはありませんでした。

これは、多くの古いWebサーバーがさまざまなコンテンツタイプのJavaScriptを送信し、ブラウザがかなり受け入れていることです。ブラウザがJavaScriptを要求した場合、ブラウザはJavaScriptを取得して実行したとみなします。

GIFの内部ではJavaScriptを隠し、それを実行させることも可能である参照たら:。http://iamajin.blogspot.com/2014/11/when-gifs-serve-javascript.html

Webインフラストラクチャのナンバーワンのルールは、「ウェブを壊さないでください、」であるので、誰もスクリプトのセキュリティモデルを変更するつもりはないので、他の回避策を講じなければなりません。

つまり、誰かが定期的なJSONをJSONPとして提供していて、ブラウザがそれを実行することを拒否した場合、世界はブラウザがWebサーバーではなく壊れていると見なします。

(参照リンクはありますか、タイムラインを設定してくれてありがとう)

関連する問題