そうでなければ(比較的)安全でないWebサイトの「ショッピングカート」部分を保護する方法に関するベストプラクティスソリューションを探しています.
サイト内の既存の設定では、セキュリティで保護されていない Cookie が使用され、(SSL を介して) 資格情報のトランザクションのみが保護されます。サイトの残りの部分は HTTP 経由でアクセスされるため、データは安全に送信されません。しかし、これは私たちにとって問題ではありません。
ただし、現在、「ショッピング カート風」の要素をサイトに追加しており、チェックアウト プロセスを保護したいと考えています。これまでの私の考えは:
- 有効期限が 15 分の安全な Cookie (長いランダムな「Base64 でエンコードされた」文字列を値として保持する) に依存する。
- 同じ値 (および作成タイムスタンプ) が SESSION (もちろんサーバー側) に保存されます。注: 私は通常の安全でないセッションについて話しています。
- ユーザーが自分自身を認証した場合にのみ、Cookie がユーザーに送信されます。彼がすでにサインインしている場合、彼は「再認証」し (まだ有効な 15 分間の安全な Cookie を持っていない限り)、パスワードをもう一度提供する必要があります。
- 基本的に、これは通常の 15 分間の安全な「Tomcat セッション」とあまり変わらないと思います。このセッションの資格情報とデータの両方が、HTTPS/SSL 経由で送信されます。
メモと考え:
- セキュア Cookie を検証するために、タイムスタンプとトークン キーの両方がサーバー上の通常の (非セキュア) セッション オブジェクトに格納されます。しかし - セキュア トークンは SSL 経由でのみ送信されるため、(理論上) 中間者が傍受する方法はありません。したがって、攻撃者が通常のセッション ID を盗んでユーザーの ID を偽造したとしても、クレジット カードの詳細にアクセスするには、このユーザーの (通常の) セッションに関連付けられた特定のセキュア トークンを知る必要があります。
- クライアント側とサーバー側の両方で 15 分の Cookie ライフタイムが強制されます (作成タイムスタンプを保持することにより)。
- Cookie 自体 (およびセキュア トークン) には、(暗号化された、またはその他の) 機密情報は保持されません。キーは長いランダムな文字列です。
- JavaのSecureRandomを使用してトークンを生成し、それによって生成されたランダムバイトをBase64エンコードして、英数字、「スラッシュ」、および「プラス」文字のみが含まれるようにします。私は 512 のランダム バイトを使用することを考えましたが、それより少ない数で実行できる場合は、喜んで聞きます :)
これは良い解決策と考えられますか? この場合に適用できるより良い方法はありますか? 「やり過ぎ」せずにセキュリティをさらに強化するためにできることはありますか?
前もって感謝します!トム