web-dev-qa-db-ja.com

ログイン/セッションCookie、Ajax、セキュリティ

Ajaxベースのログインフォームがクライアント側のCookieを認証および設定するための最も安全な方法を決定しようとしています。私はこのようなXSS攻撃に関するものを見てきました:

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

そして

http://www.codinghorror.com/blog/archives/001167.html

だから、私の中心的な質問は...

1)cookieを安全に設定するために純粋なajaxを使用していますか?その場合、最も安全な方法は何ですか(httpOnly + SSL +暗号化された値など)?

2)純粋なajaxメソッドにはcookieクライアント側の設定が含まれますか?これはまったく安全ですか?

3)この方法でCookieを設定すると、すべての主要なブラウザ/ OSで信頼できるでしょうか?

4)非表示のIFrameを使用すると、より安全になります(Cookieを設定するためにWebページを呼び出す)。

5)可能であれば、誰かがこのためのコードを持っていますか(PHPが私のバックエンドです)?

私の目標は、Cookieを設定し、ページから移動せずにサーバーへの次の呼び出しで使用できるようにすることです。

私は本当に、これを行うための最も安全な方法である合意を明確にしたいと考えています。結局、このコードはオープンソースになる予定ですので、商用コード(または公の監視に耐えられないもの)は使用しないでください。

ありがとう、-トッド

43
supertodda
  1. セッションはクライアントをサーバーにバインドするため、Cookieはサーバー側で生成する必要があります。したがって、トークンの交換は、ある段階でサーバーからクライアントに移動する必要があります。クライアントは信頼されていないリモートマシンであるため、クライアント側でCookieを生成することは実際には役に立ちません。

    AJAX呼び出し中にCookieを設定することは可能です。サーバー(およびネットワーク)に対してAJAX呼び出しは単なるHTTP呼び出しであり、サーバーによるHTTP応答でCookieを設定できるため、AJAX呼び出しに応答してセッションを開始でき、Cookieは通常どおりクライアントによって保存されます。

    したがって、AJAXを使用して、ページ上のフォームからPOSTを信頼した場合と同じように、ログインプロセスを実行できます。サーバーはそれらを同じように認識し、サーバーがCookieを設定すると、ブラウザーはそれを保管します。

    基本的に、クライアント側のJavascriptはCookieの値を知る必要はありません(また、知らない場合はセキュリティが向上します。これは、最近のブラウザで採用されている「httponly」Cookie拡張機能を使用して実現できます)。通常のページ要求であるか、またはAJAX要求であるかに関係なく、クライアントからサーバーへの以降のHTTP呼び出しは、httponlyとマークされていて、ブラウザーがその拡張を受け入れる場合でも、そのCookieを自動的に含めます。スクリプトはCookieを「認識する」必要はありません。

    HTTPS(HTTP over SSL)の使用について言及しました。これにより、他のユーザーが転送中に情報を読み取ったり、サーバーになりすますことができなくなるため、パスワードやその他の重要な情報のプレーンテキストの送信を防止するのに非常に便利です。また、CSRFがスローする可能性のあるすべてのことを免れることはなく、セッションの固定やXSSなどからユーザーを保護することもできませんが、ネットワークベースの攻撃から保護するのに役立ちます。したがって、HTTPSを使用する場合は、すべてを修正するものとして考えることは避けます:stillクロスサイトスクリプティングとクロスサイトリクエストフォージェリに注意する必要があります。

  2. (1.私はそれらをある程度組み合わせたものを参照)

  3. CookieはサーバーによってHTTP応答ヘッダーに設定されているため、信頼できます。ただし、ブラウザ間の互換性を維持するには、AJAXが使用できない場合にログインできることを確認する必要があります。これには、JavaScriptがない場合、または= AJAXは使用できません。(注:現在2014年では、AJAXのブラウザサポートについて心配する必要はありません)。

  4. セキュリティは変更されません。 AJAX以前に "シミュレート"するために以前に使用された隠しiframeを確認しました-つまり、サーバーに対して非同期呼び出しを行います。ただし、基本的にはそうしませんが、それは必要ありません。問題は、サーバーがCookieを設定していることです。クライアントは、AJAXで行うかどうかに関係なく、Cookieを受け入れて返します。

ほとんどの場合、AJAXを使用するかどうかは、すべての実際のセキュリティがサーバー側で発生するのと同じくらいセキュリティに影響を与えることはなく、サーバーに対してAJAX呼び出しはAJAX以外の呼び出しと同じです:信頼されないため、 セッションの固定ログインCSRF などの問題に注意する必要があります [〜#〜] csrf [〜#〜] および [〜#〜] xss [〜#〜] のようにセッション全体に影響する問題AJAXを使用していない場合と同じです。AJAXを使用しても問題は実際には変わりませんが、例外として、慣れていないか、より複雑です。

回答は2014年9月に更新されました

71
thomasrutter