クッキーに基づくアクセス制限のあるサイトで AJAX を使用する場合、JavaScript はクッキーにアクセスする必要があります。HttpOnly クッキーは AJAX サイトで機能しますか?
編集:Microsoft は、HttpOnly が指定されている場合に JavaScript による Cookie へのアクセスを禁止することで XSS 攻撃を防ぐ方法を作成しました。FireFox は後にこれを採用しました。そこで質問です。StackOverflow などのサイトで AJAX を使用している場合、Http-Only Cookie はオプションになりますか?
編集2:質問2. HttpOnlyの目的がJavaScriptによるクッキーへのアクセスを防ぐことであり、XmlHttpRequestオブジェクトを介してJavaScript経由でクッキーを取得できる場合、HttpOnlyの意味は何ですか?
編集3:以下はWikipediaからの引用です:
ブラウザがこのようなクッキーを受信すると、その後のHTTP交換では通常通りそれを使用することになっていますが、クライアント側のスクリプトには表示されません。[32] この
HttpOnly
フラグは標準の一部ではなく、すべてのブラウザに実装されているわけではありません。現在、XMLHTTPRequestを介してセッションクッキーの読み取りまたは書き込みを防止する方法はないことに注意してください。[33]
HttpOnly を使用するとブロックされることは理解していますdocument.cookie
。しかし、XMLHttpRequest オブジェクト内の Cookie 値を読み取ることは可能であり、XSS を許してしまうようです。HttpOnly を使用すると、Cookie を基本的に読み取り専用にするよりも、どのように安全性が高まるのでしょうか?
あなたの例では、私はあなたの に書き込むことはできませんdocument.cookie
が、あなたの Cookie を盗み、XMLHttpRequest オブジェクトを使用して自分のドメインに投稿することはできます。
<script type="text/javascript">
var req = null;
try { req = new XMLHttpRequest(); } catch(e) {}
if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
req.open('GET', 'http://stackoverflow.com/', false);
req.send(null);
alert(req.getAllResponseHeaders());
</script>
編集4:申し訳ありませんが、私が言いたかったのは、XMLHttpRequest を StackOverflow ドメインに送信し、getAllResponseHeaders() の結果を文字列に保存し、クッキーを正規表現で抽出して、それを外部ドメインに投稿できるということです。Wikipedia と ha.ckers はこの点で私と同意見のようですが、もう一度教えていただけると嬉しいです...
最終編集:ああ、どうやら両方のサイトが間違っているようです。これは実際にはFirefoxのバグ実際のところ、現在 HttpOnly を完全にサポートしているブラウザは IE6 と 7 だけです。
私が学んだことをすべて繰り返します:
- HttpOnly は IE7 および FireFox で document.cookie へのすべてのアクセスを制限します (他のブラウザについては不明)
- HttpOnly は、IE7 の XMLHttpObject.getAllResponseHeaders() の応答ヘッダーから Cookie 情報を削除します。
- XMLHttpObjects は、その発信元のドメインにのみ送信されるため、Cookie がドメイン間で投稿されることはありません。
編集: この情報はもはや最新ではない可能性があります。
ベストアンサー1
はい、この機能には HTTP のみの Cookie で問題ありません。これらの Cookie は、サーバーへの XmlHttpRequest のリクエストとともに提供されます。
Stack Overflow の場合、Cookie は XmlHttpRequest リクエストの一部として自動的に提供されます。Stack Overflow 認証プロバイダーの実装の詳細はわかりませんが、その Cookie データはおそらく、「投票」コントローラー メソッドよりも低いレベルで ID を確認するために自動的に使用されます。
より一般的には、クッキーはないAJAX に必要です。技術的に必要なのは、XmlHttpRequest サポート (または古いブラウザでの iframe リモート処理) だけです。
ただし、AJAX 対応機能にセキュリティを提供する場合は、従来のサイトと同じルールが適用されます。各リクエストの背後にあるユーザーを識別するための何らかの方法が必要であり、ほとんどの場合、Cookie がその手段となります。
あなたの例では、document.cookie に書き込むことはできませんが、XMLHttpRequest オブジェクトを使用して cookie を盗み、自分のドメインに投稿することはできます。
XmlHttpRequest はクロスドメイン リクエストを行いません (まさにあなたが触れているような理由によります)。
通常、iframe リモート処理または JSONP を使用してドメインに Cookie を送信するスクリプトを挿入できますが、その場合、Cookie はアクセスできないため、HTTP のみで再度保護されます。
サーバー側で StackOverflow.com を侵害していない限り、私の Cookie を盗むことはできません。
編集 2: 質問 2。Http-Only の目的が JavaScript による Cookie へのアクセスを防ぐことであり、XmlHttpRequest オブジェクトを介して JavaScript 経由で Cookie を取得できる場合、Http-Only の意味は何ですか?
次のシナリオを考えてみましょう。
- ページに JavaScript コードを挿入する方法を見つけました。
- ジェフがページを読み込むと、私の悪意のある JavaScript が彼の Cookie を私のものと一致するように変更します。
- ジェフはあなたの質問に対して素晴らしい回答を提出しました。
- 彼が自分のクッキーデータではなく私のクッキーデータで送信したので、答えは私のものになります。
- あなたは「私の」素晴らしい回答に投票します。
- 私の実際のアカウントは要点を理解しています。
HTTP のみの Cookie では、2 番目のステップは不可能となり、XSS の試みは失敗します。
編集 4: 申し訳ありませんが、XMLHttpRequest を StackOverflow ドメインに送信し、getAllResponseHeaders() の結果を文字列に保存し、Cookie を正規表現で抽出して、それを外部ドメインに投稿できるという意味でした。Wikipedia と ha.ckers はこの点で私と同意見のようですが、再教育していただければ幸いです...
そうです。その方法でもセッション ハイジャックは可能です。ただし、XSS ハッキングを成功させることができる人の数は大幅に減ります。
しかし、私の例のシナリオに戻ってみると、HTTPのみのするクライアントの Cookie を変更することに依存する XSS 攻撃を正常に遮断しました (珍しいことではありません)。
結局のところ、a) 単一の改善だけでは解決できない全て脆弱性とb) いかなるシステムもこれまで完全に安全です。HTTPのみはXSS 対策に役立つツールです。
同様に、XmlHttpRequest のクロスドメイン制限はすべての XSS エクスプロイトを 100% 防止できるわけではありませんが、それでも制限を削除することは考えられません。