私は基本的な.ajax()POSTメソッドをPHPファイルに持っています。jQueryの.ajax()にCSRFトークンが必要ですか?
どのようなセキュリティ対策が必要ですか?
AJAX経由で送信し、PHPファイルで確認する非表示のMD5入力フィールドを使用して、いくつかのポストが書かれていました。これは十分な方法ですか?
私は基本的な.ajax()POSTメソッドをPHPファイルに持っています。jQueryの.ajax()にCSRFトークンが必要ですか?
どのようなセキュリティ対策が必要ですか?
AJAX経由で送信し、PHPファイルで確認する非表示のMD5入力フィールドを使用して、いくつかのポストが書かれていました。これは十分な方法ですか?
CSRFのリスクは、外部サイトがあなたにデータを送信し、ユーザーのブラウザが自動的に認証クッキーを送信することです。
外部サイトではなく、サイトの別のページからリクエストが送信されたかどうかを確認するために、受信アクション(あなたの$.ajax()
メソッドがPOSTデータを送信する)に何らかの方法が必要です。
これにはいくつかの方法がありますが、確認できるトークンとハッカーが到達できないトークンを追加することをお勧めします。その最も単純で
:
$.ajax()
要求に追加します。ハッカーはあなたのDBにアクセスできず、実際にはあなたがあなたに送信したページを読むことができません(XSS攻撃を受けない限り、別の問題です)。トークン。
トークンで重要なのは、あなたがを予測(および検証)することができますということで、それとハッカーがことができません。
この理由から、長いランダムなものを生成してDBに格納するのが最も簡単ですが、代わりに暗号化されたものを構築することができます。 CSRの攻撃者があなたのトークンを生成する方法を見つけたら、あなたはハッキングされるでしょう。
もう1つの方法は、攻撃者があなたのクッキーを読んだり変更したりすることができないので、トークンを(データベースではなく)クッキーに保存することです。次に、Cookie内のHTTP POSTデータに一致するトークンになります。
これらは、正常に使用されるたびに変更されるトークン(再送信を防止する)や、ユーザーとアクションに固有のトークンなど、より洗練されたものにすることができますが、それが基本パターンです。
要求偽装に関しては、クライアントがどのように要求を送信したかは関係ありません。他のタイプの投稿と同じCSRFルールがajax投稿に適用されます。
私はCSRF prevention cheat sheetを読むことをお勧めします。ユーザーごとのシークレットトークンを使用するのが最も一般的な保護方法です。
かなり一般的にも、最初の使用後に、特定のユーザーや障害のために取得し、要求ごとのワンタイムトークン、です。 – Tadeck
@タデックそのアプローチは、CSRFよりもダブルサブミットを防ぐのにより有効です。 – rook
[参照したソース](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet)に記載されているように、ワンタイムトークンは、リスクの高い機能で非常に強力なセキュリティが使用されます。これは、「CSRF_よりも二重提出を防ぐのに有益です」とは反対に、CSRFに対してあなたの申請を保護するより厳しい方法です。 – Tadeck
トークンは必要ありませんが、CSRFに対して状態を変更する機能は保護する必要があります。
これを行う簡単な方法の1つは、AJAXリクエストとともに送信されるヘッダーを追加することです。ランダムなトークンは必要ありません。
ので、これは動作します:HTMLフォームは、攻撃者によってそれらに追加カスタムヘッダーを持つことができません
もちろん、サーバー側のコードでは、アクションを実行する前にヘッダーが存在することを確認する必要があります。
[同一出身のポリシー](https://en.wikipedia.org/wiki/Same-origin_policy)がそのような行為を防止するが、ユーザは別のウェブサイトからのAJAXリクエストをどのように投稿することができますか? – Songo
@Songo残念なことに、すべてのブラウザでサポートされているわけではありません。プロキシの多くはヘッダーを取り除き、それも破ります。最後に、起源の外からPOSTすることができます。そのため、AJAXに意図しているにもかかわらず、攻撃者を意味するものではありません。基本的には、同じ起源のポリシーを持っているべきですが、うまく動作するブラウザに依存しているので、それに頼るべきではありません。 CSRFトークンを使用すると、同じ起源が迂回されても検証できるものが得られます。 – Keith
@Songo Chromeの最新バージョンでも、GETリクエスト(つまり、ウェブページ上で ''
''タグ)を実行することはできますが、動作します。 @Keithブラウザはすべてのリクエストに対してCookieを自動的にWebページに送信するため、Cookieを信頼しません。攻撃者がiFrameまたはフォームを送信すると、自動的にCookieが送信されます。 –
arleslie