客户端ip: 服务器ip: 如果你想进一步了解ServerVariables,可以用
访问客户端的 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];elsereturn System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];}
HTTP_VIA 如果有该条信息, 就证明您使用了代理服务器,代理服务器的地址就是后面的数值。 HTTP_X_FORWARDED_FOR 如果有该条信息, 也证明了您使用了代理服务器代理服务器的地址就是后面的数值。 需要注意的,HTTP_X_FORWARDED_FOR 的值,并不一定是只有一个IP地址,下面的信息也是可能的,每行一条记录。下面数据取材于CSDN 实际的数据。
一、没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP 二、使用透明代理服务器的情况:Transparent Proxies REMOTE_ADDR = 最后一个代理服务器 IP 这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。 三、使用普通匿名代理服务器的情况:Anonymous Proxies REMOTE_ADDR = 最后一个代理服务器 IP 隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。 四、使用欺骗性代理服务器的情况:Distorting Proxies REMOTE_ADDR = 代理服务器 IP 告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。 五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies) REMOTE_ADDR = 代理服务器 IP 完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。 下面是一个简单的代码,来演示冒名上述信息,博客的测试代码。
protected void Page_Load(object sender, EventArgs e){StringBuilder info = new StringBuilder();// 我们关注的三个 ServerVariablesinfo.AppendFormat("HTTP_VIA = {0} <br />\r\n", Request.ServerVariables["HTTP_VIA"]);info.AppendFormat("HTTP_X_FORWARDED_FOR = {0} <br />\r\n", Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);info.AppendFormat("REMOTE_ADDR = {0} <br />\r\n", Request.ServerVariables["REMOTE_ADDR"]);info.AppendLine("*********** \r\n<br />");// 其他有参考价值的 ServerVariablesforeach (string key in Request.ServerVariables.AllKeys){info.AppendFormat("{0} = {1} <br />\r\n", key, Request.ServerVariables[key]);}Response.Clear();Response.Write(info.ToString());Response.End();} 客户端发送请求的代码: static void Main(string[] args){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("", "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 <br /> 上面测试代码需要注意的是: 我们在客户端代码中设置了三个HTTP头信息,分别是: REMOTE_ADDR、VIA、X_FORWARDED_FOR HTTP_REMOTE_ADDR、HTTP_VIA 、HTTP_X_FORWARDED_FOR 注意他们的区别!! REMOTE_ADDR 属性是无法设置的。或者说,设置的不是我们所希望的。
1、REMOTE_ADDR 不可被修改,但是可能会获得代理服务器的IP,而不是实际客户端的IP。 2、通过 HTTP_VIA、HTTP_X_FORWARDED_FOR 我们可以获得代理服务器所代理的信息,但是这依靠代理服务器的支持。另外,这两个值可以被修改。我们通过它获得的信息可能是不真实的。另,HTTP_X_FORWARDED_FOR 的信息可能是一个集合,不含 REMOTE_ADDR 中的代理服务器IP。 没有一个完美的解决获得客户端IP地址的方法,我们只能在上面2个信息中取舍。 获取当前时间 DateTime.Now.ToShortDateString()
|
|