0

(私は、ajax呼び出しが同じオリジンからのものでなければならないことをすでに知っており、関連する回答をすでに読んでいます)

しかし、私は何かを理解するのに問題があります:

Facebook (とりわけ) はfor(;;) || while(1)、json 応答で次のことを使用します。

ここに画像の説明を入力

そして-明らかに-データを使用したい場合は、for(;;)文字列を削除してから自分で解析する必要があります。

また、(@esailijaから)次のように言われました:

ポイントである同じ起源からでない限り、forループを削除することはできません

わかりました。これは、同じオリジン ポリシーによるものです。

しかし、私はこれを尋ねます:

John が自分のサイト ( john.com)でこれを行っているとします。

 bla bla...
   <script src="facebook.com/ajax/recent" type="text/javascript"></script>
 bla bla...

FacebookのURLと同じであることに注意してください(私の一番左の赤い矢印)-

予測

  • 彼が 経由<scrip>...</script>で応答を受け取り、応答が なしであった場合for(;;)、 - 彼はまだ何もできません{"__ar:1,....}! (jsonpのように)パディングする必要がありますmyCallBack({"__ar:1,....});

つまり、次のようになります。

var a=1;

{"__ar:1,....}  <--- john can't do nothing with this.

var b=1;

質問 :

私は何が欠けていますか、そして私の仮定は正しいですか?

4

3 に答える 3

2

当時の問題は、無意味な配列リテラルを持つことは安全ではないということでした。たとえば、次のようなコードを実行します。

[1,2,3]

実際には、これらの値で配列コンストラクターを呼び出します。次の例が示すように、これは無害とはほど遠いものです。

<script>
Array = function() {
     //Steal the values etc
};
</script>
<script src="facebook.com/yourtimeline.json"></script>
//above has code like [{profile_id}, {},...] which calls the array constructor
//with those values and I have access to them.

Facebook にログインしているときに、古いブラウザー (Firefox 2 のように古いことを意味します) で私のページにアクセスした場合、for(;;). しかし、あるので、私のページは無期限にループします。

于 2013-10-01T08:15:44.463 に答える
1

彼が応答を受け取り、(あなたが言ったように) 最初に応答がなかった場合for(;;);、それは JavaScript コード (オブジェクト初期化子) の有効なセグメントであり、その結果はどこにも保存されませんでした。無害に実行されます。しかし、この方法で JSON フィードを保護している人々は、このように悪用されたときに無害に実行されることを望まないため、この意図的な汚染を最初に追加して、悪用しようとするのが苦痛になるようにします。

最初にその種の意図的な汚染を伴うフィードを消費する一般的な方法は、同じオリジン (または少なくとも CORS ポリシーで許可されているオリジン) にあることに依存しています: ajax を介してテキストとしてフィードを読み込み、先頭for(;;);に追加し、残りを JSON として解析します。

于 2013-10-01T07:17:39.327 に答える