質問

これに関連するのは、 私が尋ねた別の質問. 。要約すると、フォームが POST される URL の特殊なケースがあり、認証やユーザーのセッションの維持に Cookie に依存することはできませんが、どういうわけか彼らが誰であるかを知る必要があり、彼らがログインしていることを知るために!

問題の解決策を思いついたと思いますが、具体化する必要があります。これが私が考えていることです。「ユーザー名」という非表示のフォームフィールドを作成し、その中にユーザーのユーザー名を暗号化して配置します。その後、フォームが POST されると、ブラウザーから Cookie を受信しなくても、非表示のフォーム フィールドを復号化してユーザー名を取得できるため、ログインしていることがわかります。

私が確認している主なセキュリティ上の欠陥は、リプレイ攻撃です。誰かがその暗号化された文字列を入手し、そのユーザーとして POST するのを防ぐにはどうすればよいでしょうか?SSL を使用して文字列を盗むのを難しくできることはわかっています。また、暗号化キーを定期的にローテーションして文字列の有効期間を制限できるかもしれませんが、完全な方法を見つけたいと思っています。解決。何かアイデアがある人はいますか?ASP.Net ViewState はリプレイを妨げますか?もしそうなら、彼らはどうやってそれを行うのでしょうか?

編集:データベースに何も保存する必要のないソリューションを期待しています。アプリケーションの状態は問題ありませんが、IIS の再起動後は存続できないか、Web ファームやガーデン シナリオではまったく動作しません。データベースなしでこれを保護することさえ可能であると確信していないため、今のところ私はクリスの答えを受け入れます。しかし、誰かがデータベースに関係しない答えを思い付いたら、私はそれを受け入れます。

役に立ちましたか?

解決

ユーザー名とパスワードとともにタイムスタンプをハッシュすると、リプレイ攻撃のウィンドウを数秒以内に閉じることができます。これがあなたのニーズを満たすかどうかはわかりませんが、少なくとも部分的な解決策にはなります。

他のヒント

本当に状態を保存したくない場合は、タイムスタンプと短い有効期限を使用してリプレイ攻撃を制限することが最善だと思います。たとえば、サーバーは次のものを送信します。

{Ts, U, HMAC({Ts, U}, Ks)}

ここで、Ts はタイムスタンプ、U はユーザー名、Ks はサーバーの秘密キーです。ユーザーはこれをサーバーに送り返し、サーバーは提供された値に基づいて HMAC を再計算することでそれを検証します。有効であれば、いつ発行されたかがわかり、たとえば 5 分より古い場合は無視することもできます。

このタイプの開発に適したリソースは次のとおりです。 Web でのクライアント認証の推奨事項と禁止事項

ここにはいくつかの良い答えがあり、それらをすべてまとめることで最終的に答えが見つかります。

  1. クライアントに送信されるすべての状態/ノンス関連情報をブロック暗号化 (AES-256+) し、ハッシュ (SHA-2+) します。それ以外の場合、ハッカーはデータを操作し、それを表示してパターンを学習し、他のすべてを回避するだけです。覚えて ...開いているウィンドウが 1 つだけ必要です。

  2. POST リクエストで返送されるリクエストごとに 1 回限りのランダムで一意の nonce を生成します。これにより次の 2 つのことが行われます。これにより、POST 応答がその要求とと​​もに送信されることが保証されます。また、特定の get/POST ペアのセットの 1 回限りの使用を追跡することもできます (リプレイの防止)。

  3. タイムスタンプを使用して、ノンス プールを管理しやすくします。上記の #1 に従って、タイムスタンプを暗号化された Cookie に保存します。アプリケーションの最大応答時間またはセッション (例: 1 時間) より古いリクエストはすべて破棄します。

  4. リクエストを行ったマシンの「適度に一意な」デジタル フィンガープリントを、暗号化されたタイムスタンプ データとともに保存します。これにより、攻撃者がクライアントの Cookie を盗んでセッション ハイジャックを実行する別のトリックを防ぐことができます。これにより、リクエストが 1 回だけではなく、フォームが送信されたマシン (または攻撃者がコピーすることが事実上不可能になるほど十分に近いマシン) から返されることが保証されます。

上記のすべてをコーディングなしで実行できる、ASPNET および Java/J2EE セキュリティ フィルター ベースのアプリケーションがあります。パフォーマンスが重要な場合、大規模システム (証券取引会社、銀行、大容量の安全なサイトなど) の nonce プールを管理することは簡単な仕事ではありません。Web アプリケーションごとにこれをプログラムするのではなく、これらの製品を検討することをお勧めします。

ハッシュを作成するためにユーザー名とともに使用される、ある種のランダムなチャレンジ文字列を使用できます。チャレンジ文字列をサーバー上のデータベースに保存すると、その文字列が 1 回だけ、特定の 1 人のユーザーに対してのみ使用されるようにすることができます。

私のアプリの 1 つでは、「リプレイ」攻撃を阻止するために、セッション オブジェクトに IP 情報を挿入しました。コードでセッション オブジェクトにアクセスするたびに、必ず Request.UserHostAddress を渡してから、IP が一致することを確認するために比較します。そうでない場合は、明らかにその人以外の誰かがこのリクエストを行ったことになるため、null を返します。これは最善の解決策ではありませんが、リプレイ攻撃を阻止するための少なくとも 1 つの障壁になります。

メンテナンスにメモリまたはデータベースを使用できますか? どれでも ユーザーまたはリクエストに関する情報はありますか?

そうであれば、フォームのリクエストに応じて、内容がランダムに生成された数値である非表示のフォーム フィールドを追加します。リクエストがレンダリングされるときに、このトークンをアプリケーション コンテキストまたは何らかのストア (データベース、フラット ファイルなど) に保存します。フォームが送信されると、アプリケーション コンテキストまたはデータベースをチェックして、ランダムに生成された番号がまだ有効かどうかを確認します (有効と定義したとしても、X 分後に期限切れになる可能性があります)。その場合は、このトークンを「許可されたトークン」のリストから削除します。

したがって、リプレイされたリクエストには、サーバー上で有効とみなされなくなった同じトークンが含まれることになります。

私は Web プログラミングのいくつかの面については初心者ですが、先日これについて読んでいました。を使用する必要があると思います ノンス.

(リプレイ攻撃は簡単に IP/MAC スプーフィングに関するものである可能性があり、加えて動的 IP に対する攻撃も行われます)

ここで求めているのは単なるリプレイではなく、単独では意味がありません。SSL を使用し、何も手作りしないでください。

ASP.Net ViewState は面倒なので避けてください。PKI は重量が大きく肥大化していますが、少なくとも独自のセキュリティ「スキーム」を考案しなくても機能します。したがって、可能であれば、私はそれを使用し、常に相互認証を行います。サーバーのみの認証はまったく役に立ちません。

ViewState にはセキュリティ機能が含まれています。見る この記事 ASP.NET の組み込みセキュリティ機能の一部について。サーバー上の machine.config 内のサーバー machineKey に対して検証を実行し、各ポストバックが有効であることを確認します。

記事のさらに下に, 独自の非表示フィールドに値を保存したい場合は、 LosFormatter クラスを使用して、ViewState が暗号化に使用するのと同じ方法で値をエンコードします。

private string EncodeText(string text) {
  StringWriter writer = new StringWriter();
  LosFormatter formatter = new LosFormatter();
  formatter.Serialize(writer, text);
  return writer.ToString();
}

各キーを 1 回だけ受け入れると (たとえば、キーを GUID にして、それが返されたときに確認するなど)、リプレイを防ぐことができます。もちろん攻撃者が反応した場合 初め, 、すると新たな問題が発生します...

これは WebForms ですか、それとも MVC ですか?MVC の場合は、AntiForgery トークンを利用できます。これは、基本的に GUID を使用し、その投稿の guid 値で Cookie を設定することを除いて、あなたが言及したアプローチに似ているようです。詳細については、Steve Sanderson のブログを参照してください。 http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

もう 1 つ、ポストバックでリファラーを確認することを検討しましたか?これは防弾ではありませんが、役立つかもしれません。

https を使用してください...リプレイ保護が組み込まれています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top