HttpOnly CookieはAJAXリクエストでどのように機能しますか?


195

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

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

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

編集3:ウィキペディアからの引用です:

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

document.cookieHttpOnlyを使用するとブロックされることを理解しています。しかし、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()の結果を文字列に保存し、Cookieを正規表現で出力して、それを外部ドメインに投稿できます。ウィキペディアとha.ckersはこれに関して私と同意しているようですが、私は再教育を受けたいと思います...

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

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

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

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


私はあなたの例をgreasemonkeyスクリプトで投げました、そして、FFはもはやクッキーを表示しないようです。優れた研究と例。

同じオリジンポリシーでは、スクリプトが実行されているドメインとは異なるドメインにhttpリクエストを送信できない場合があります。ただし、window.locationを使用してユーザーをページにリダイレクトすることで簡単にCookieを渡し、クエリ文字列パラメーターを通じてすべての情報を渡すことができると思います。
Luca Marzi

@LucaMarzi " スクリプトが実行されているのとは異なるドメインにhttpリクエストを行うことはできません "サイトXはホストYからの画像を含めることができないと言っていますか?(Mosaic以降、すべてのブラウザでサポートされている機能ですか?)
curiousguy

回答:


64

はい、この機能にはHTTPのみのCookieが適しています。サーバーへのXmlHttpRequestのリクエストは引き続き提供されます。

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

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

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

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

XmlHttpRequestはクロスドメインリクエストを行いません(触れているまさにそのような理由で)。

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

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

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

このシナリオを考えてみましょう:

  • JavaScriptコードをページに挿入する手段を見つけました。
  • Jeffがページをロードし、私の悪意のあるJavaScriptが私のものと一致するようにCookieを変更します。
  • ジェフはあなたの質問に優れた答えを出します。
  • 彼は彼の代わりに私のクッキーデータを使ってそれを提出するので、答えは私のものになります。
  • あなたは「私の」星の答えに投票します。
  • 私の実際のアカウントがポイントを取得します。

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

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

そのとおりです。あなたはまだその方法でセッションハイジャックすることができます。それでも、XSSがあなたをハッキングすることにさえ成功することができる人々の群れをかなり薄くします。

ただし、私の例のシナリオに戻ると、HTTP-Only どこで行うかを確認できますクライアントのCookieの変更に依存する(珍しいことではない)XSS攻撃をうまく遮断。

つまり、a)単一の改善ですべての脆弱性を解決できるわけではなく、b)完全に安全なシステムはないということです。HTTPのみ、XSSをするのに役立つツールです。

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


多くのフレームワークは、csrf トークンをCookieに入れますcsrfJSが取得するためにcsrfトークンを非表示のHTML要素に配置しない限り、チェックが必要なAJAX呼び出しは機能しないと思います。
ユーザー

4

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


4

はい、それらはAjaxベースのサイトにとって実行可能なオプションです。認証Cookieはスクリプトによる操作用ではありませんが、サーバーに対して行われたすべてのHTTPリクエストでブラウザによって単に含まれます。

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

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

私はHTTPのみのCookieが本当に好きです。これは、非常に優れたアイデアだった独自のブラウザー拡張機能の1つです。


3

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

Ajaxは厳密にCookieを必要としませんが、他のポスターが述べたように、Cookieは役立つ場合があります。CookieをHTTPOnlyにマークしてスクリプトから非表示にすることは、一部のブラウザでのみサポートされているわけではなく、一般的な回避策があるため、部分的にしか機能しません。

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

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

AJAXリクエストが確実に認証されるようにするには、リクエスト自体とHTTPヘッダーにCookieを含める必要があります。たとえば、スクリプトまたは一意の非表示の入力を使用します。HTTPOnlyはそれを妨げます。

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


1

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


1

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

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

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


XmlHttpRequestにはCookieが必要です。あなたが言及する拡張検索は、ログインページの背後にある可能性があります。ただし、JavascriptがCookie値をVMに公開できる必要があるかどうかは、別の問題です。
Shiny and New安宇

1

説明として-サーバーの観点からは、AJAXリクエストによってリクエストされるページは、ユーザーがリンクをクリックして実行する標準のHTTP getリクエストと本質的に違いはありません。すべての通常のリクエストプロパティ:ユーザーエージェント、IP、セッション、Cookieなどがサーバーに渡されます。


「セッション」はHTTPの概念ではありません。これは、フレームワークによってHTTPの概念の上に構築された高レベルの概念です。
curiousguy 2018年

0

いいえ、AJAX呼び出しが要求するページはCookieにもアクセスできます。これは、ログインしているかどうかを確認するためのものです。

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


0

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

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

いいえ、攻撃を防ぐ方法はありません。古いブラウザでも、JavaScriptを介してCookieに簡単にアクセスできます。あなたはhttpだけをバイパスすることができます、等。あなたが思いついたものは何でも十分な努力を与えられて回避することができます。コツは、やりがいのある努力をしすぎることです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.