asp.Net IPの関連資料を取得する

6049 ワード

ASP.NetはクライアントのIPを取得し、最も一般的なのは以下のコードを使用することです.
 
  
string user_IP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

エージェントサーバの状況を知っている人は、ユーザーがエージェントサーバを使用している場合、上記のコードがエージェントサーバのIPアドレスを取得していることを知っています.ユーザが複数のプロキシサーバを使用している場合、サーバの最後のプロキシサーバに到達するIPアドレスである.
REMOTE_ADDRの説明:
クライアントのIPアドレスにアクセスします.
この情報はユーザーが変更できません.
もし本当に変更されたら、あなたもサーバーと接続できません.サーバーはこれに従ってクライアントと接続して通信します.実際にこのServerVariablesを修正するテストをしたが、少しも効果がなかった.実際の値を取得します.
他:Request.UserHostAddressとRequest.ServerVariables["REMOTE_ADDR"]は実際には同じ値です.
プロキシサーバを迂回してユーザーの実際のIPアドレスを取得するにはどうすればいいですか?この場合、私たちは一般的に次のようなコードに似ています(ここでは簡単に説明しますが、いくつかの境界判断はしていません).
private static string getIp(){
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
return System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(new char[]{','})[0];
else
return System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
これで十分ですか?これは問題がありますHTTP_X_FORWARDED_FOR 、HTTP_VIAは偽名がつけられる.ちょうどここにSQL注入の問題があったら、それは大変です.
では、HTTP_を具体的に見てみましょう.VIAとHTTP_X_FORWARDED_FORこの2つのServerVariables.
HTTP_VIA
この情報があれば、プロキシサーバを使用していることを証明します.プロキシサーバのアドレスは次の数値です.
HTTP_X_FORWARDED_FOR
この情報がある場合は、プロキシ・サーバーのプロキシ・サーバーのアドレスが後の数値であることも証明されます.
注意が必要なのは、HTTP_X_FORWARDED_FORの値は、必ずしもIPアドレスが1つしかないとは限らず、次の情報も可能であり、行ごとに1つの記録がある.以下のデータはCSDNの実際のデータに取材する.
10.194.73.11
unknown, unknown, 211.100.22.30
203.98.182.163, 203.98.182.163, 203.129.72.215
172.16.20.110, 202.116.64.196, 203.81.21.61
10.194.75.83, 10.194.73.11, 10.194.73.11, unknown
192.168.120.57, unknown, unknown, 211.10.10.195
10.2.4.211, 219.141.250.3
3.242.165.168, 218.108.22.164
unknown, 211.100.22.30
192.168.83.56, 210.21.224.233
218.94.136.176, 203.81.21.61
unknown, 210.75.1.181
10.161.196.218, 202.104.134.23
222.216.6.148, 222.216.6.146
155.161.59.47, unknown
この2つの値はいずれも変更できることに注意してください.
この3つの値:REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FORでは、以下の5つのケースに分けることができます.
一、プロキシサーバーを使用していない場合:
REMOTE_ADDR=IP
HTTP_VIA=数値なしまたは非表示
HTTP_X_FORWARDED_FOR=数値なしまたは非表示
二、透明プロキシサーバーを使用する場合:Transparent Proxies
REMOTE_ADDR=最後のプロキシサーバIP
HTTP_VIA=プロキシサーバIP
HTTP_X_FORWARDED_FOR=実際のIPは、複数のプロキシサーバを通過した場合、この値は次のようになります.203.98.182.163、203.98.182.163、203.129.72.215です.
このようなエージェント・サーバは、アクセス・オブジェクトに情報を転送しても、実際のアイデンティティを隠すことはできません.
三、一般匿名プロキシサーバーを使用する場合:Anonymous Proxies
REMOTE_ADDR=最後のプロキシサーバIP
HTTP_VIA=プロキシサーバIP
HTTP_X_FORWARDED_FOR=プロキシサーバIPであり、複数のプロキシサーバを通過した場合、この値は、203.98.182.163、203.98.182.163、203.129.72.215と同様である.
実際のIPは非表示ですが、プロキシ・サーバを使用してアクセスしていることがアクセス・オブジェクトに明らかになりました.
四、欺瞞エージェントサーバーを使用する場合:Distorting Proxies
REMOTE_ADDR=プロキシサーバIP
HTTP_VIA=プロキシサーバIP
HTTP_X_FORWARDED_FOR=ランダムなIPであり、複数のプロキシサーバを通過した場合、この値は、203.98.182.163、203.98.182.163、203.129.72.215と同様である.
アクセス先にエージェントサーバを使用していることを伝えましたが、実際のIPの代わりに虚偽のランダムIPを作成しました.
五、高匿名エージェントサーバーを使用する場合:High Anonymity Proxies(Elite proxies)
REMOTE_ADDR=プロキシサーバIP
HTTP_VIA=数値なしまたは非表示
HTTP_X_FORWARDED_FOR=数値がない、または表示されない場合、複数のプロキシサーバを通過した場合、この値は次のようになります:203.98.182.163、203.98.182.163、203.129.72.215.
すべての情報をプロキシサーバの情報に置き換え、そのプロキシサーバを完全に使用してオブジェクトに直接アクセスするようにします.
サーバ側のUserIP.ASPXページのコード:
 
  
protected void Page_Load(object sender, EventArgs e){
StringBuilder info = new StringBuilder(); // ServerVariables
info.AppendFormat("HTTP_VIA = {0}
\r
",
Request.ServerVariables["HTTP_VIA"]);
info.AppendFormat("HTTP_X_FORWARDED_FOR = {0}
\r
",
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
info.AppendFormat("REMOTE_ADDR = {0}
\r
",
Request.ServerVariables["REMOTE_ADDR"]);
info.AppendLine("*********** \r

");
// ServerVariables
foreach (string key in Request.ServerVariables.AllKeys){
info.AppendFormat("{0} = {1}
\r
", key, Request.ServerVariables[key]);
}
Response.Clear();
Response.Write(info.ToString());
Response.End();
}

[code]
static void Main(string[] args){
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:7867/MyTestWebSite/UserIP.aspx");
request.Headers.Add("REMOTE_ADDR", "192.168.5.88");
request.Headers.Add("VIA", "ghj1976");
request.Headers.Add("X_FORWARDED_FOR", "0.0.0.0");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader stream = new StreamReader(response.GetResponseStream());
string info = stream.ReadToEnd();
stream.Close();
response.Close();
request = null;
Console.Write(info);
Console.ReadLine();
}

テストの結果の重要な情報:テストの結果のデータは比較的に多くて、私はここでいくつかの重要なものだけを羅列しました.
HTTP_VIA = ghj1976
HTTP_X_FORWARDED_FOR = 0.0.0.0
REMOTE_ADDR = 127.0.0.1
***********
REMOTE_ADDR = 127.0.0.1
HTTP_VIA = ghj1976
HTTP_REMOTE_ADDR = 192.168.5.88
HTTP_X_FORWARDED_FOR = 0.0.0.0
上記のテストコードで注意すべきことは、次のとおりです.
クライアントコードには、次の3つのHTTPヘッダ情報が設定されています.
REMOTE_ADDR、VIA、X_FORWARDED_FOR
実際にサーバセグメントでは、この3つの値は次の3つのプロパティで読み込む必要があります.
HTTP_REMOTE_ADDR、HTTP_VIA 、HTTP_X_FORWARDED_FORは彼らの違いに注意します!!
REMOTE_ADDR属性は設定できません.あるいは、設定されているのは私たちが望んでいるものではありません.
まとめ:
1、REMOTE_ADDRは変更できませんが、実際のクライアントのIPではなく、プロキシサーバのIPが取得される可能性があります.
2、HTTPを通じて_VIA、HTTP_X_FORWARDED_FORエージェントサーバがエージェントする情報を取得できますが、これはエージェントサーバのサポートに依存します.また、この2つの値は変更できます.私たちがそれを通じて得た情報は真実ではないかもしれません.また、HTTP_X_FORWARDED_FORの情報はREMOTE_を含まない集合である可能性があるADDRのプロキシサーバIP.
クライアントのIPアドレスを取得する方法を完璧に解決する方法はなく、上の2つの情報の中で選択するしかありません.