リクエスタの IP がすべての Web リクエストを通過することに依存できますか?
asp.net アプリケーションがあり、IP を使用して認証されていない訪問者を識別したいと考えています。空の値を取得しないように、そこに何かがある限り、IP が一意であるかどうかはあまり気にしません。
そうでない場合は、値が空の場合を処理する必要があると思います。
または、IP よりも優れた識別子はありますか?
リクエスタの IP がすべての Web リクエストを通過することに依存できますか?
asp.net アプリケーションがあり、IP を使用して認証されていない訪問者を識別したいと考えています。空の値を取得しないように、そこに何かがある限り、IP が一意であるかどうかはあまり気にしません。
そうでない場合は、値が空の場合を処理する必要があると思います。
または、IP よりも優れた識別子はありますか?
から入手できます Request.ServerVariables["REMOTE_ADDR"]
。
防御するのは悪くない。これが設定されていない恐ろしいエラー状態が心配な場合は、そのケースを確認し、それに応じて対処してください。
この値が役に立たない理由はたくさんあります。ローカル ネットワーク上のロード バランサーや SSL デコーダーなど、最後のホップのアドレスしか取得できない場合があります。ISP プロキシ、または一部の会社の NAT ファイアウォールである可能性があります。
その点で、一部のプロキシは、トラフィックを転送している IP を追加の HTTP ヘッダーで提供する場合があります。これは 経由でアクセスできます
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
。Request.ServerVariables["REMOTE_ADDR"]
最初にこれを確認してから、またはにフォールバックすることをお勧めしRequest.UserHostAddress
ます。
参照/監査のためにこれらのことをログに記録することは、確かに悪い考えではありません。
この値はWebサーバーによって設定されていると思います.IPを別のものに設定すると、リクエストへの応答が返されないため、それを偽造する方法は実際にはありません.
心配する必要があるのはプロキシだけです。プロキシからの全員が同じ IP を取得します。
Web サーバーが IP ネットワークではない何らかのネットワークでリッスンしていない限り、常に IP アドレスを取得します。ただし、IP アドレスは必ずしもユーザーごとに一意であるとは限りません。
Web リクエストは http 接続であり、これは tcp 接続であり、すべての tcp 接続には 2 つのエンドポイントがあります。したがって、それは常に存在します。しかし、それはあなたがそれについて知っているのと同じくらいです。一意でも確実に正確でもありません(すべてのプロキシやものを使用)。
はい、すべての要求には IP アドレスが必要ですが、前述のように、一部の ISP はプロキシ、NAT、またはゲートウェイを使用しており、個人のコンピューターを提供しない場合があります。
次のコマンドを使用して、この IP を (c# で) 簡単に取得できます。
文字列 IP = Context.Request.ServerVariables["REMOTE_ADDR"].ToString();
またはasp/vbscriptで
IP = request.servervariables("REMOTE_ADDR")
IP アドレスは、ユーザーの識別にはあまり使用されません。すでに述べたように、企業のプロキシやその他のプライベート ネットワークは、単一の IP アドレスとして表示される場合があります。
ユーザーをどのように認証していますか? 通常、ユーザーにログインしてもらい、その状態をアプリのセッションに保存します。