205

Cookieに基づくアクセス制限のあるサイトでAJAXを使用する場合、JavaScriptはCookieにアクセスする必要があります。HttpOnly CookieはAJAXサイトで機能しますか?

編集: Microsoftは、HttpOnlyが指定されている場合にCookieへのJavaScriptアクセスを禁止することにより、XSS攻撃を防ぐ方法を作成しました。FireFoxは後でこれを採用しました。だから私の質問は:StackOverflowのようなサイトでAJAXを使用している場合、Http-Onlycookiesはオプションですか?

編集2:質問2. HttpOnlyの目的がCookieへのJavaScriptアクセスを防ぐことであり、XmlHttpRequestオブジェクトを介してJavaScript経由でCookieを取得できる場合、HttpOnlyのポイントは何ですか?

編集3:ウィキペディアからの引用は次のとおりです。

ブラウザがそのようなCookieを受信すると、次のHTTP交換では通常どおりに使用することになっていますが、クライアント側のスクリプトには表示されません。[32] フラグは標準のHttpOnly一部ではなく、すべてのブラウザに実装されているわけではありません。現在、XMLHTTPRequestを介してセッションCookieを読み書きすることを妨げるものはないことに注意してください。[33]。

document.cookieHttpOnlyを使用すると、それがブロックされることを理解しています。ただし、XMLHttpRequestオブジェクトでCookie値を読み取ることができるようで、XSSが可能です。HttpOnlyはどのようにあなたをより安全にしますか?クッキーを本質的に読み取り専用にすることによって?

あなたの例では、私はあなたに書き込むことはできませんがdocument.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()の結果を文字列に保存し、Cookieを正規表現して、外部ドメインに投稿できることを意味しました。ウィキペディアとha.ckersはこれについて私に同意しているようですが、私は再教育されたいと思っています...

最終編集:ああ、どうやら両方のサイトが間違っているようです。これは実際にはFireFoxのバグです。IE6と7は、実際には現在HttpOnlyを完全にサポートしている唯一のブラウザーです。

私が学んだすべてを繰り返すために:

  • HttpOnlyは、IE7およびFireFoxのdocument.cookieへのすべてのアクセスを制限します(他のブラウザーについては不明)
  • HttpOnlyは、IE7のXMLHttpObject.getAllResponseHeaders()の応答ヘッダーからCookie情報を削除します。
  • XMLHttpObjectsは、元のドメインにのみ送信できるため、Cookieのドメイン間の投稿はありません。

編集:この情報はおそらく最新ではありません。

4

9 に答える 9

68

はい、この機能には HTTP のみの Cookie で問題ありません。それらは、サーバーへの XmlHttpRequest の要求で引き続き提供されます。

スタック オーバーフローの場合、Cookie は XmlHttpRequest 要求の一部として自動的に提供されます。スタック オーバーフロー認証プロバイダーの実装の詳細はわかりませんが、その Cookie データはおそらく、「投票」コントローラー メソッドよりも低いレベルで身元を確認するために自動的に使用されます。

より一般的には、AJAX には Cookie は必要ありません。技術的に必要なのは、XmlHttpRequest のサポート (または、古いブラウザーでは iframe のリモート処理) だけです。

ただし、AJAX 対応機能にセキュリティを提供する場合は、従来のサイトと同じルールが適用されます。各リクエストの背後にあるユーザーを識別する何らかの方法が必要であり、ほとんどの場合、Cookie はその目的を達成するための手段です。

あなたの例では、あなたの document.cookie に書き込むことはできませんが、あなたの Cookie を盗み、XMLHttpRequest オブジェクトを使用して自分のドメインに投稿することはできます。

XmlHttpRequest はクロスドメインリクエストを作成しません (まさにあなたが触れている理由のようなものです)。

通常は、スクリプトを挿入して、iframe リモーティングまたは JSONP を使用して Cookie をドメインに送信できますが、HTTP 専用はアクセスできないため、Cookie を再び保護します。

サーバー側で StackOverflow.com を侵害していない限り、私の Cookie を盗むことはできません。

編集 2: 質問 2. Http-Only の目的が JavaScript による Cookie へのアクセスを防止することであり、XmlHttpRequest オブジェクトを介して JavaScript を介して Cookie を取得できる場合、Http-Only のポイントは何ですか?

次のシナリオを検討してください。

  • ページに JavaScript コードを挿入する方法を見つけました。
  • Jeff がページをロードすると、私の悪意のある JavaScript が彼の Cookie を私のものと一致するように変更します。
  • ジェフはあなたの質問に素晴らしい回答を提出します。
  • 彼は彼の代わりに私の Cookie データで送信するため、回答は私のものになります。
  • あなたは「私の」恒星の答えに投票します。
  • 私の実際のアカウントがポイントになります。

HTTP のみの Cookie を使用すると、2 番目のステップが不可能になるため、XSS の試行が無効になります。

編集 4: 申し訳ありませんが、XMLHttpRequest を StackOverflow ドメインに送信し、getAllResponseHeaders() の結果を文字列に保存し、Cookie を正規表現してから、それを外部ドメインに投稿できるという意味でした。ウィキペディアとハッカーはこれについて私に同意しているようですが、私は再教育されたいと思っています...

そのとおりです。その方法でセッションハイジャックを行うことができます。ただし、その XSS ハッキングでさえ成功裏に実行できる人々の群れは大幅に減少します。

ただし、私の例のシナリオに戻ると、クライアントの Cookie の変更に依存する XSS 攻撃 (珍しいことではありません) を HTTP のみうまく遮断していることがわかります。

つまり、a) 1 つの改善ですべての脆弱性が解決されるわけではなく、b)完全に安全なシステムは存在しないという事実です。HTTP-Only、XSS に対抗するための便利なツールです。

同様に、XmlHttpRequest のクロス ドメイン制限がすべての XSS エクスプロイトを防止することに 100% 成功しているわけではありませんが、制限を取り除くことなど夢にも思いません。

于 2008-08-26T22:24:56.563 に答える
5

はい、Ajax ベースのサイトでは実行可能なオプションです。認証 Cookie は、スクリプトによる操作用ではなく、サーバーに対して行われるすべての HTTP 要求にブラウザーによって含まれているだけです。

スクリプトは、セッション Cookie の内容を気にする必要はありません。認証されている限り、ユーザーまたはスクリプトによって開始されたサーバーへの要求には、適切な Cookie が含まれます。スクリプト自体が Cookie の内容を認識できないという事実は問題ではありません。

認証以外の目的で使用される Cookie については、スクリプトでこれらを変更または読み取りできるようにする場合は、HTTP のみのフラグなしで設定できます。どの Cookie を HTTP のみにするかを選択できます。たとえば、UI 設定 (並べ替え順序、左側のペインを折りたたむかどうか) などの機密性の低いものはすべて、スクリプトを使用して Cookie で共有できます。

私は HTTP のみの Cookie が本当に気に入っています。これは、非常に優れたアイデアであるプロプライエタリなブラウザー拡張機能の 1 つです。

于 2009-02-26T12:16:09.410 に答える
4

必ずしもそうとは限りませんが、何をしたいかによって異なります。少し詳しく教えていただけますか?AJAXは動作するためにCookieにアクセスする必要はありません。情報を抽出するために独自にリクエストを行うことができ、AJAX呼び出しが行うページリクエストはCookieデータにアクセスし、Javascriptが直接アクセスしなくてもそれを呼び出し元のスクリプトに返すことができます。クッキー

于 2008-08-26T13:18:50.043 に答える
2

明確にするために、サーバーの観点からは、AJAXリクエストによってリクエストされるページは、ユーザーがリンクをクリックすることによって行われる標準のHTTPgetリクエストと本質的に同じです。すべての通常のリクエストプロパティ:user-agent、ip、session、cookiesなどがサーバーに渡されます。

于 2008-08-26T13:31:41.167 に答える
2

これにはもう少し続きがあります。

Ajax は Cookie を厳密に必要とするわけではありませんが、他の投稿者が言及しているように Cookie は便利です。すべてのブラウザーがサポートしているわけではなく、一般的な回避策があるため、Cookie を HTTPOnly にマークしてスクリプトから非表示にすることは、部分的にしか機能しません。

XMLHTTPresponse ヘッダーが Cookie を提供しているのは奇妙です。技術的には、サーバーは応答で Cookie を返す必要はありません。クライアントに設定されると、有効期限が切れるまで設定されたままになります。ただし、再利用を防ぐためにリクエストごとに Cookie を変更するスキームもあります。そのため、XMLHTTP 応答で Cookie を提供しないようにサーバーを変更することで、この回避策を回避できる場合があります。

ただし、一般的には、HTTPOnly は注意して使用する必要があると思います。XMLHTTP を使用せずに単純な投稿フォームを使用して、別のサイトから発信された ajax のような要求をユーザーが送信するように攻撃者が手配するクロス サイト スクリプティング攻撃があり、ブラウザーのまだアクティブな Cookie が要求を認証します。

AJAX リクエストが認証されていることを確認するには、リクエスト自体と HTTP ヘッダーに Cookie を含める必要があります。たとえば、スクリプトまたは独自の隠し入力を使用します。HTTPOnly はそれを妨げます。

通常、HTTPOnly が必要な興味深い理由は、Web ページに含まれるサードパーティのコンテンツが Cookie を盗むのを防ぐためです。しかし、サードパーティのコンテンツを含めることに非常に慎重になり、積極的にフィルタリングする興味深い理由がたくさんあります。

于 2009-06-10T14:17:48.903 に答える
1

AJAX呼び出しを行うと、Cookieはブラウザによって自動的に処理されるため、JavascriptがCookieをいじくり回す必要はありません。

于 2008-08-26T13:26:39.947 に答える
1

したがって、JavaScriptがCookieにアクセスする必要があると想定しています。

ブラウザからのすべてのHTTPリクエストは、問題のサイトのCookie情報を送信します。JavaScriptはCookieの設定と読み取りの両方を行うことができます。Cookieは、定義上、Ajaxアプリケーションには必要ありませんが、ほとんどのWebアプリケーションでユーザーの状態を維持するために必要です。

「AJAXを使用する場合、JavaScriptはCookieにアクセスする必要がありますか?」という質問に対する正式な回答。-したがって、「いいえ」です。たとえば、Ajaxリクエストを使用して自動提案オプションを提供する拡張検索フィールドについて考えてみてください。その場合、Cookie情報は必要ありません。

于 2008-08-26T13:31:37.670 に答える
0

いいえ、AJAX呼び出しが要求するページはCookieにもアクセスできます。これにより、ログインしているかどうかがチェックされます。

Javascriptを使用して他の認証を行うこともできますが、私はそれを信用しません。私は常に、バックエンドであらゆる種類の認証チェックを行うことを好みます。

于 2008-08-26T13:23:43.837 に答える
0

はい、CookieはAjaxにとって非常に便利です。

リクエストURLに認証を入れるのは悪い習慣です。先週、GoogleキャッシュからURLの認証トークンを取得することについてのニュースがありました。

いいえ、攻撃を防ぐ方法はありません。古いブラウザでも、javascriptを介したCookieへの簡単なアクセスが許可されています。httpのみをバイパスすることもできます。十分な努力を払えば、思いついたものは何でも回避できます。秘訣は、やりがいのあるものにするためにあまりにも多くの努力をすることです。

サイトをより安全にしたい場合(完全なセキュリティはありません)、有効期限が切れる認証Cookieを使用できます。次に、Cookieが盗まれた場合、攻撃者は有効期限が切れる前にCookieを使用する必要があります。そうでない場合は、そのアカウントに疑わしいアクティビティがあることを示す良い兆候があります。時間枠が短いほどセキュリティは向上しますが、キーの生成と保守にかかるサーバーの負荷は大きくなります。

于 2009-03-23T15:35:12.793 に答える