2012-02-01 13 views
25

私は基本的な.ajax()POSTメソッドをPHPファイルに持っています。jQueryの.ajax()にCSRFトークンが必要ですか?

どのようなセキュリティ対策が必要ですか?

AJAX経由で送信し、PHPファイルで確認する非表示のMD5入力フィールドを使用して、いくつかのポストが書かれていました。これは十分な方法ですか?

答えて

34

CSRFのリスクは、外部サイトがあなたにデータを送信し、ユーザーのブラウザが自動的に認証クッキーを送信することです。

外部サイトではなく、サイトの別のページからリクエストが送信されたかどうかを確認するために、受信アクション(あなたの$.ajax()メソッドがPOSTデータを送信する)に何らかの方法が必要です。

これにはいくつかの方法がありますが、確認できるトークンとハッカーが到達できないトークンを追加することをお勧めします。その最も単純で

  • トークン長いランダムな文字列を作成し、ユーザーに対してそれを保存するにログオンします。
  • トークンを含む要求を$.ajax()要求に追加します。
  • 要求に応じて、トークンがユーザー用に保存したものと一致することを確認します。
  • トークンが一致しない場合は、CSRFハックがあります。

ハッカーはあなたのDBにアクセスできず、実際にはあなたがあなたに送信したページを読むことができません(XSS攻撃を受けない限り、別の問題です)。トークン。

トークンで重要なのは、あなたがを予測(および検証)することができますということで、それとハッカーがことができません。

この理由から、長いランダムなものを生成してDBに格納するのが最も簡単ですが、代わりに暗号化されたものを構築することができます。 CSRの攻撃者があなたのトークンを生成する方法を見つけたら、あなたはハッキングされるでしょう。

もう1つの方法は、攻撃者があなたのクッキーを読んだり変更したりすることができないので、トークンを(データベースではなく)クッキーに保存することです。次に、Cookie内のHTTP POSTデータに一致するトークンになります。

これらは、正常に使用されるたびに変更されるトークン(再送信を防止する)や、ユーザーとアクションに固有のトークンなど、より洗練されたものにすることができますが、それが基本パターンです。

+6

[同一出身のポリシー](https://en.wikipedia.org/wiki/Same-origin_policy)がそのような行為を防止するが、ユーザは別のウェブサイトからのAJAXリクエストをどのように投稿することができますか? – Songo

+3

@Songo残念なことに、すべてのブラウザでサポートされているわけではありません。プロキシの多くはヘッダーを取り除き、それも破ります。最後に、起源の外からPOSTすることができます。そのため、AJAXに意図しているにもかかわらず、攻撃者を意味するものではありません。基本的には、同じ起源のポリシーを持っているべきですが、うまく動作するブラウザに依存しているので、それに頼るべきではありません。 CSRFトークンを使用すると、同じ起源が迂回されても検証できるものが得られます。 – Keith

+0

@Songo Chromeの最新バージョンでも、GETリクエスト(つまり、ウェブページ上で '' ''タグ)を実行することはできますが、動作します。 @Keithブラウザはすべてのリクエストに対してCookieを自動的にWebページに送信するため、Cookieを信頼しません。攻撃者がiFrameまたはフォームを送信すると、自動的にCookieが送信されます。 – arleslie

2

要求偽装に関しては、クライアントがどのように要求を送信したかは関係ありません。他のタイプの投稿と同じCSRFルールがajax投稿に適用されます。

私はCSRF prevention cheat sheetを読むことをお勧めします。ユーザーごとのシークレットトークンを使用するのが最も一般的な保護方法です。

+2

かなり一般的にも、最初の使用後に、特定のユーザーや障害のために取得し、要求ごとのワンタイムトークン、です。 – Tadeck

+2

@タデックそのアプローチは、CSRFよりもダブルサブミットを防ぐのにより有効です。 – rook

+2

[参照したソース](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet)に記載されているように、ワンタイムトークンは、リスクの高い機能で非常に強力なセキュリティが使用されます。これは、「CSRF_よりも二重提出を防ぐのに有益です」とは反対に、CSRFに対してあなたの申請を保護するより厳しい方法です。 – Tadeck

0

トークンは必要ありませんが、CSRFに対して状態を変更する機能は保護する必要があります。

これを行う簡単な方法の1つは、AJAXリクエストとともに送信されるヘッダーを追加することです。ランダムなトークンは必要ありません。

ので、これは動作します:HTMLフォームは、攻撃者によってそれらに追加カスタムヘッダーを持つことができません

  • CORSを有効にしないと、カスタムヘッダーをクロスドメインに渡すことはできません。

もちろん、サーバー側のコードでは、アクションを実行する前にヘッダーが存在することを確認する必要があります。

さらに詳しい情報:What's the point of the X-Requested-With header?

関連する問題