1

クライアントが Cookie をブロックしているときにセッション状態を維持する提案された方法を使用して、セキュリティ上の欠陥があるかどうかを判断しようとしています。

通常、クライアントのCookieにUUIDを保存し、UUIDがデータベースに保存されているものと一致する場合は自動ログインします。ただし、クライアントで Cookie がブロックされている場合、マシンの UUID にアクセスできないため、IP アドレスを使用して解決し、その方法でデータベースと照合する必要があります。

以下を使用して IP アドレスを決定します。

String ip = request.getHeader("X-FORWARDED-FOR");
if(ip == null) {
    ip = request.getRemoteAddr();
}

私はこの分野では少し緑ですが、このアプローチにはセキュリティ上の欠陥があるかもしれないと思います。たとえば、ユーザーがパブリック Wi-Fi ネットワーク (喫茶店、空港、ホテルなど) でアプリケーションにアクセスすると、パブリック IP が保存され、ユーザーのアカウントがその IP に一致します。同じ IP で彼らの背後にいる人は、特にログアウトすることを忘れない限り、アカウントに完全にアクセスできます。これを防ぐにはどうすればよいですか?私は、IP に一致する以外に Cookie がブロックされている場合に、別のアプローチを使用することに完全に反対しているわけではありません。クッキーが利用できない場合にユーザーのログインを完全に禁止する以外に、他のアプローチが何であるかはわかりません。本当に安全な方法はこれだけですか?

アップデート

TJ Crowders のコメントに基づくと、最近の統計によると、実際にユーザーの 2% が Cookie をブロックしています。私はいくつかの理由で Cookie に依存することを選択し、Cookie がブロックされているためにセッション状態を管理できない場合に警告を表示します。

4

2 に答える 2

4

...しかし、このアプローチにはセキュリティ上の欠陥があると思います。たとえば、ユーザーが公共の Wi-Fi ネットワーク (喫茶店、空港、ホテルなど) でアプリケーションにアクセスした場合...

それだけではありません。自宅でワイヤレス ブロードバンドを使用している人は、全員が同じ IP から来ているように見えるため、同居している 2 人が同時にあなたのサイトを使用したい場合 (一方が他方に勧めた可能性があります)、競合が発生します。

Cookie を使用できない場合は、セッション ID をすべての URL に入れるという古い J2EE 手法を使用できます。すでに J2EE を使用している場合は、組み込みの this (HttpServletResponse#encodeURLなど) のサポートを使用できます。これ;jsessionid=tokenは URL で使用されます。そうでない場合は、クエリ文字列パラメーターを使用して手法を実装するのは簡単です。

于 2013-11-02T15:03:31.387 に答える
2

サーブレット API を使用すると、URL 書き換えを使用して、Cookie を使用せずにセッションを追跡できます (特定のセッションでアプリを指すすべての URL にセッション ID が含まれます)。いくつかのルールを守れば、これは自動的に行われます:

  • HttpServletResponse.encodeRedirectURL()リダイレクト時に常に使用
  • URLを生成するときに常に使用HttpServletResponse.encodeURL()します(リンク、画像など)

JSTL の<c:url>呼び出しencodeURL()に注意してください。

于 2013-11-02T15:05:09.037 に答える