[解決済み】なぜ人々はjsonレスポンスの前に「throw 1; <dont be evil>」や「for(;;);」のようなコードを置くのでしょうか?重複
質問
重複の可能性があります。
なぜGoogleはJSONレスポンスにwhile(1);を前置するのですか?
Googleはこのようなjsonを返します。
throw 1; <dont be evil> { foo: bar}
で、Facebookのajaxにはこんな感じのjsonがあります。
for(;;); {"error":0,"errorSummary": ""}
- なぜ、停止するようなコードを入れているのでしょうか? が実行され、無効なjsonが作成されるのでは?
- 無効なのにどうやって解析するんだ? で、evalしようとするとクラッシュします。 というのは?
- から取り除くだけなのでしょうか? 文字列(高そう)?
- セキュリティ上の利点はありますか? これは?
セキュリティのためということに対し
スクレイパーが別のドメインにいる場合、スクレイパーは
script
タグでデータを取得することができます。たとえ
for(;;);
攻撃者はどのようにデータを取得するのでしょうか?変数に代入されていないのだから、参照先がなくてガベージコレクションされるだけではないのか?
基本的にクロスドメインでデータを取得するためには、次のようなことが必要です。
<script src="http://target.com/json.js"></script>
しかし、クラッシュスクリプトを付加しなくても、グローバルにアクセスできる変数に代入されていない限り、攻撃者はJsonデータを使用することができません(このようなケースでは代入されていません)。クラッシュスクリプトがない場合でも、サイト上でデータを使用するにはサーバーサイドスクリプトを使用しなければならないため、クラッシュコードは事実上何の役にも立ちません。
解決方法は?
<ブロッククオート
がなくても
for(;;);
攻撃者はどのようにしてデータを入手するのでしょうか?
攻撃は、組み込み型の挙動を変更することに基づいており、特に
Object
と
Array
を変更することで、そのコンストラクタ関数やその
prototype
. そして、対象となるJSONが
{...}
または
[...]
を構成すると、それらのオブジェクトは攻撃者自身のバージョンとなり、予期せぬ振る舞いをする可能性があります。
例えば、セッタープロパティをハックして
Object
オブジェクト・リテラルで書かれた値を裏切ることになります。
Object.prototype.__defineSetter__('x', function(x) {
alert('Ha! I steal '+x);
});
次に
<script>
は、そのプロパティ名を使用するいくつかのJSONを指していた。
{"x": "hello"}
値
"hello"
が漏れてしまいます。
配列とオブジェクトのリテラルがセッターを呼び出す方法は、議論の余地があります。Firefox は、有名なウェブサイトへの攻撃を受けて、バージョン 3.5 でこの挙動を削除しました。しかし、この記事を書いている時点では、Safari (4) と Chrome (5) はまだこの脆弱性を持っています。
また、コンストラクタ関数を再定義する攻撃も、現在ではすべてのブラウザで禁止されています。
Array= function() {
alert('I steal '+this);
};
[1, 2, 3]
そして今のところ、IE8 のプロパティの実装(ECMAScript 第 5 版の標準と
Object.defineProperty
) では現在動作しません。
Object.prototype
または
Array.prototype
.
しかし、過去のブラウザを保護するだけでなく、将来的にJavaScriptの拡張が同様のリークを引き起こす可能性もあり、その場合、chaffはそれらからも保護する必要があります。
関連
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] JSONとは何か、何に使うのか?
-
[解決済み] Javascriptの `atob()` と `btoa()` は、なぜこのような名前なのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】SyntaxError: 'import' と 'export' は 'sourceType: module' とだけ表示されるかもしれない - Gulp
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み] [Solved] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングする
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み】「for (;;); { json data }」のようなAjax呼び出し応答は何を意味するのでしょうか?[重複している]。