以前のログインが成功したサーバー側でペア (ソース IP、有効なユーザー名) を保存することにより、既知のマシンと未知のマシンを識別できる Web アプリケーションを開発する必要があります。クライアントIPを取得することは可能ですか?
2 に答える
簡単に言えば、常に実際のクライアント IP アドレスを取得できるとは限らないということです。
クライアントが独自の IP アドレスを持っていて、サーバーに直接接続している場合は、それHttpServletRequest.getRemoteAddr()
を返す必要があります。でも:
クライアントのリクエストがプロキシまたはリバース プロキシ経由でサーバーに到達した場合、
getRemoteAddr()
は最初のアップストリーム プロキシ アドレスを返します。localhost
リクエストがlocalhostから来る場合と同様に、クライアントがサーバーをアドレス指定する場合。クライアントが NAT ゲートウェイまたは IPv4 <-> IPv6 ブリッジの背後にある場合、ゲートウェイまたはブリッジの IP アドレスが表示される可能性があります。
次に、IPアドレスがなりすましの可能性があるという問題があります。
要するに、実際のクライアント IP アドレスを知ることに依存するセキュリティ スキームは、しばしば問題を引き起こします。
問題がリバース プロキシによるものである場合 (127.0.0.1 が表示されている場合は、そのことが暗示されます)、リバース プロキシでリクエスト ヘッダーをリクエストに追加して、どのリモート IP アドレスが表示されたかを示すことができます。次に、サーバーは の代わりにそのヘッダーを使用する必要がありますgetRemoteAddr()
。ただし、プロキシが実際のクライアント IP アドレスを認識していない場合は役に立ちません。
サーブレットでは、次のようにします。
public class GetAddress extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String ip = request.getRemoteAddr();
// now you can check if the ip exists and if not store it or do other usefull stuff ...
}
}