2009-03-04 10 views
2

ユーザーがStrutsアプリケーションにサインアップすると、別のページへのリンクを含む電子メールを送信します。リンクでは、クエリ文字列に一意の識別子を含める必要があるため、リンク先ページでユーザーを識別し、それに応じて反応することができます。Javaでクエリ文字列を保護する最も良い方法は何ですか?

このシステムのセキュリティを向上させるために、まず識別子を含むクエリ文字列を暗号化してから、リンクが使用されてから数日後に期限切れになるように設定します。

これを行うために私がどのようなJavaテクノロジ/方法をお勧めしますか?

答えて

4

私はあなたの懸念についてのいくつかの仮定にするつもりです:

  1. ユーザーが別のユーザーのURLを推測することはできないはずです。
  2. URLを再利用できないようにしてください(セッションリプレイ攻撃を避けてください)。
  3. URLは永久に生きてはいけません。したがって、ブルートフォースプロービングは避けてください。

ここで私はそれをやっています。

  • ユーザーIDと有効期限のタイムスタンプをテーブルに保存します。
  • これらを文字列に連結し、SHA-1ハッシュを作成します。
  • SHA-1ハッシュ値を使用してURLを生成します。そのようなすべてのURLを検証を行うサーブレットにマップします。
  • 誰かがハッシュのあるページのリクエストを送信したときに、それを使用してユーザーと有効期限を検索します。
  • ユーザーがリンク先ページの処理をすべて完了したら、データベースの行を「使用済み」としてマークします。
  • 毎日ジョブを実行して、有効期限を過ぎたかまたは有効期限を過ぎた行をパージします。
+0

これは良いアプローチです。しかし、ハッシュではなくランダムな128ビットの識別子を選択するだけです。よりシンプルで安全です。 – erickson

+0

私は同意します。ハッシュの必要はありません。ランダムな場合、キーをリバースエンジニアリングする唯一の方法は、データベーステーブルを使用することです。 – banjollity

+0

良い点はエリクソン&ボンジョーリティです。私はちょうど反射のハッシュを使用したと思います。 – mtnygard

2

最初の部分はGenerating Private, Unique, Secure URLsです。期限切れの場合は、一意のキー作成タイムスタンプをデータベースに格納し、たとえばnow-keyCreatedAt <の3日間だけアクションを実行する必要があります。別の方法は、cronまたはQuartzジョブが定期的に "now-keyCreatedAt < 3日間"と評価される行を定期的に削除することです。

0

私はあなたがステートレスな方法でこれを行うことができると思います。

  • mtnygardが示唆しているように、URLパラメータと秘密の塩ストリングのSHA-1ハッシュを作成します。
  • URLに必要なパラメータとしてハッシュ値を追加します。
  • 電子メールにURLを送信します。

    • 再びハッシュを計算し、URLのいずれかに計算された値を比較することによって、URLの整合性を確認します。

    URLにユーザーがクリックを

秘密の塩ストリングを漏らさない限り、誰もシステムへのリクエストを偽造することはできません。しかし、他の提案とは異なり、これは古いURLの再生を妨げません。あなたの状況によっては、それは望ましいかもしれません。

関連する問題