5

安全な Web アプリケーションを設計する必要があります。CRAMメソッドを使用したログイン時だけでなく、リクエストごとにチャレンジ/レスポンスを行うセッション処理メカニズムを提案したいと思います。

その理由は、セッション ハイジャック ( CSRFなどによる) やリプレイ攻撃、または中間者攻撃に対して Web アプリケーションを強化するためです。

ノンスの使用が推奨されている場所もありますが、Web アプリケーションでは、非同期リクエストが継続したり、ユーザーが新しいウィンドウを開いたり、戻るボタンを押したりする可能性があるため、実用的ではないようです。

アイデア: クライアントとサーバーは共有シークレット (以前に確立されたユーザー パスワード) を持っています。後続のすべてのリクエストは、そのシークレットに基づいてチャレンジ/レスポンスを再度実行します (例: 'response = hash(challenge + hashedPassword)')。サーバーは、チャレンジへの応答が一致した場合にのみ要求を実行します。CRAM のときとよく似ていますが、リクエストごとに進行中です。

質問: これは実行可能なアイデアですか? もしそうなら、それは確かに実装されていますか、それとも何らかの標準ですか? Java または php ベースの webapp でこれをどのように使用しますか?

4

2 に答える 2

2

問題は、実際に何を達成したいかということです。CSRF 攻撃と戦いたい場合は、セッション キーに加えてシークレット トークンを使用することをお勧めします。ただし、すべてのリクエストでトークンを変更すると問題が発生します-戻るボタンでセッションが強制終了されるだけでなく、通常、1 つの Web ページには非同期および並列に読み込まれたデータ (画像、CSS、JavaScript など) が多数含まれているため、アプローチ追加のリクエストごとに必要なトークンが変更され、セッションが強制終了されるため、後で追加のデータをロードすることはできません。

BASE64 やその他のトリックを使用してすべてのリソースをページに埋め込むことでこれを回避できますが、これは可能性を著しく妨げ、一部のブラウザーとの互換性の問題が発生する可能性があります。

したがって、最終的には、あなたのアプローチによってセキュリティが強化されることはほとんどありませんが、顧客にとって一連の潜在的な問題が発生する可能性が高くなります。URL のセッションごとに 1 つのシークレット トークンに固執して、CSRF と戦い、XSS などの他の攻撃や、スマートフォンなどを使用した 2 要素認証などのユーザー フレンドリーなセキュリティ対策に集中することに専念します。結局のところ、ユーザーは最近の攻撃ベクトルの第 1 位です。


更新 (2012-06-14)

トークンは XSS 攻撃には対抗しませんが、基本的な CSRF 攻撃に対して防御します (たとえば、画像に偽の URL 呼び出しを埋め込むことによって)。私は実際に今日、ユーザーの変更に対して get-request を保護し、いくつかのコードを作成する必要がある状況に遭遇しました。formコードは、静的、セッションタイムアウト、およびトークンを保護するためにも使用できる場合がありlinkます(問題が解決しました)。

アイデアは、セキュリティで保護するデータに対してハッシュ/AuthToken を生成するために使用されるサーバー シークレットを持つことです。不正な JavaScript が指定されたデータのいずれかを変更しようとすると、AuthToken が一致しなくなります。私の特定の問題では、ユーザーを認証するサーバーが1つあり、その情報を第三者に送信する必要があります(ユーザー名、メールアドレス、名前など)。この GET-Request は、認証後にユーザーが簡単に変更できる可能性があるため、GET-Request-Parameters を認証する必要があります。AuthenticationToken-Process を再実行することで、サード パーティは結果の AuthToken を比較し、受信データを検証できます。共有秘密がなければ、データを偽造することは (ほぼ) 不可能です。

あなたの問題について: GET および POST リクエスト (または私のプロジェクトのような動的トークン) で静的トークンを使用すると、ユーザーが攻撃を受けるためにクリックする必要があるフォーラムのリンクなどを介した単純な CSRF 攻撃から保護されます。リンクに正しいトークンが含まれることはないため、Web ページは安全です。ただし、攻撃者が XSS を介して Web ページに JavaScript をロードすることに成功した場合、JavaScript はページの DOM ツリー全体をスキャンしてトークンのキャプチャを見つけることができるため、これに対して役立つ技術はありません。何でも。

したがって、これは次のようになります。

  • GET および POST リクエストでトークンを使用して CSRF と戦う
  • XSS インジェクションからページを保護する
于 2012-06-13T12:45:52.330 に答える
2

OWASP のチート シートは、そのような設計上の決定のための優れたリソースであることがわかりました。

あなたのスキームは、あらゆる種類のセッション後認証を確立することなく、 HTTP ダイジェスト認証に似ています。これはおそらく HTTP Basic の改善です。そして、それは両方がTLSを介していると仮定しています!

あなたのスキームがどれほど実現可能か、またはリプレイ攻撃や MITM に対してどれほど脆弱かはわかりません。


それがオプションである場合は、<keygen>双方向の TLS セッションを確立するのに役立つ新しい html5 タグを検討してください。これが最も安全なオプションです。

于 2012-06-15T01:38:19.940 に答える