[解決済み] JSONハイジャックはモダンブラウザでも問題ないのか?
質問
Backbone.jsとTornado Webサーバーを使用しています。 Backboneでコレクションデータを受信するための標準的な動作は、JSON Arrayとして送信することです。
一方、Tornadoの標準的な動作は、以下の脆弱性があるため、JSON Arrayを許可しないようになっています。
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
関連するものには http://haacked.com/archive/2009/06/25/json-hijacking.aspx
JSONがオブジェクトのリストである場合、オブジェクトでラップする必要がないため、より自然に感じられるのです。
私は、これらの攻撃を最新のブラウザ(すなわち、現在のChrome、Firefox、Safari、IE9)で再現することができませんでした。 同時に、モダンブラウザがこれらの問題に対処していることを、どこかで確認することもできませんでした。
プログラミング技術やググり方が下手でも、誤解を招かないようにするため。
これらのJSONハイジャック攻撃は、今日でもモダンブラウザで問題になっているのでしょうか?
(注)重複する可能性があるため、申し訳ありません。 モダンブラウザで「JSONハイジャック」は可能か? しかし、受理された回答は質問に答えていないようなので - もう一度質問して、より明確な説明を受けるべき時だと思いました)。
解決方法は?
に渡された値をキャプチャすることはできなくなりました。
[]
または
{}
のコンストラクタを、Firefox 21、Chrome 27、IE 10 で使用することができます。以下は、以下で説明する主な攻撃に基づく、ちょっとしたテストページです。
http://www.thespanner.co.uk/2011/05/30/json-hijacking/
:
( http://jsfiddle.net/ph3Uv/2/ )
var capture = function() {
var ta = document.querySelector('textarea')
ta.innerHTML = '';
ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));
return arguments;
}
var original = Array;
var toggle = document.body.querySelector('input[type="checkbox"]');
var toggleCapture = function() {
var isOn = toggle.checked;
window.Array = isOn ? capture : original;
if (isOn) {
Object.defineProperty(Object.prototype, 'foo', {set: capture});
} else {
delete Object.prototype.foo;
}
};
toggle.addEventListener('click', toggleCapture);
toggleCapture();
[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {
el.addEventListener('click', function() {
document.querySelector('textarea').innerHTML = 'Safe.';
eval(this.value);
});
});
<div><label><input type="checkbox" checked="checked"> Capture</label></div>
<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>
<div><textarea></textarea></div>
をオーバーライドします。
window.Array
にセッターを追加し
Object.prototype.foo
で、短い形式と長い形式で配列とオブジェクトを初期化するテストをしています。
は ES4仕様 また、Implementation Precedentでは、Internet Explorer 6, Opera 9.20, Safari 3はObjectとArrayのローカルまたはグローバルなリバインディングを尊重せず、オリジナルのObjectとArrayのコンストラクタを使用することを指摘しています。 ES5、セクション11.1.4 .
Allen Wirfs-Brockの説明 ES5ではDefineOwnPropertyを使用しているため、オブジェクトの初期化はセッターをトリガーしてはいけないと規定されていること。 MDN: オブジェクトの操作 JavaScript 1.8.1以降、オブジェクトや配列のイニシャライザーでプロパティを設定する際にセッターは呼び出されなくなりました。 V8 問題1015 .
関連
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】React Nativeアプリをターミナルから実行するとエラーが発生する(iOS)
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] 正しい」JSONの日付形式とは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
vueネットワークリクエストソリューション ネイティブネットワークリクエストとjsネットワークリクエストライブラリ
-
要素ツリー制御によるvueTreeテーブル
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み】なぜJsonRequestBehaviorが必要なのでしょうか?
-
[解決済み】WCFサービスからきれいなJSONを返すにはどうすればいいですか?