红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore ![]() | Help |
|
February 21 其实编码使用代理服务器的门槛非常低前面我写的“ASP.net 获得客户端的IP相关知识”博客中,有一个简单的例子,演示了如何客户端编码,修改 HTTP_VIA 和HTTP_X_FORWARDED_FOR ,进而让服务器无法了解你到底是否启用的代理服务器,以及启用的是代理服务器之后的你的真实IP地址。 结合上面的技术,编码使用代理服务器,其实是非常简单的。下面就是客户段的演示代码。比起上篇博客,只修改了几行。 下面演示代码中的代理服务器地址,可能在你试验的时候,已经不通了,请更换新的代理服务器地址。 class Program .net 中的 WebProxy 类,替我们封装了代理的处理逻辑。 小结: 通过这两篇博客:ASP.net 获得客户端的IP相关知识、那些HTTP头会被增加HTTP_前缀,以及本文,我们会看到,服务器段获得IP地址,是非常脆弱的。通过编码绕过IP限制的门槛是越来越底了。通过IP做一些限制时,很多时候是非常脆弱的。当你使用IP限制策略的时候。要意识到这并不是一个强壮的限制策略。 那些HTTP头会被增加HTTP_前缀上一篇博客:ASP.net 获得客户端的IP相关知识 中我提到了,如果你想编码更改 HTTP_VIA、HTTP_X_FORWARDED_FOR 的值,你需要客户端增加的HTTP Head为:VIA、X_FORWARDED_FOR。即,少个 "HTTP_" 前缀。那么,到底读取这些值时,那些HTTP头增加时候需要增加HTTP_前缀,那些又不需要呢? 简单来说,出了一些系统预先定义的,有特殊意义的HTTP头外,其他都需要增加 "HTTP_" 前缀。这是W3C 的 The Common Gateway Interface (CGI) 规范的定义。这些预定义的变量如下:
我们通过.net 的开源代码也可以看到上面的逻辑,这部分的核心代码在 System.Web.HttpRequest 类的 FillInServerVariablesCollection 方法 internal void FillInServerVariablesCollection() { 小结: 通过上面的代码和说明可以看到: 在客户端发送的HTTP Head 信息中, 是原模原样发送的,并没有增加 HTTP_ 前缀。 服务器段接受到时,也是原模原样的。
另外,对于客户段来说,并不是所有 HTTP 头都是可以设置的,下面的是受限制的标头。它们或者直接由 API(如 Content-Type)公开,或者受到系统保护,不能被更改: Accept February 20 获得客户端的IP相关知识ASP.net 获得客户端的IP,最常见的是使用下述代码: string user_IP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 对于了解代理服务器情况的人,我们会知道,如果用户使用了代理服务器,上述代码获得的是代理服务器的IP地址;如果用户使用了多个代理服务器,则是到达服务器的最后一个代理服务器的IP地址。
REMOTE_ADDR 说明: 访问客户端的 IP 地址。
如何绕过代理服务器获得用户真实的IP地址呢? 这时候我们一般是类似如下的代码(这里我简单起见,没有作一些边界判断) private static string getIp() 这样就足够了么? 这样是有问题的,HTTP_X_FORWARDED_FOR 、HTTP_VIA 是可以被冒名的。如果正好这里有SQL注入问题的话,那可非常严重了。
下面我们就来具体看HTTP_VIA 和HTTP_X_FORWARDED_FOR 这两个 ServerVariables。 HTTP_VIA 如果有该条信息, 就证明您使用了代理服务器,代理服务器的地址就是后面的数值。 HTTP_X_FORWARDED_FOR 如果有该条信息, 也证明了您使用了代理服务器代理服务器的地址就是后面的数值。 需要注意的,HTTP_X_FORWARDED_FOR 的值,并不一定是只有一个IP地址,下面的信息也是可能的,每行一条记录。下面数据取材于CSDN 实际的数据。
对于这三个值:REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR 来说,可以分以下五种情况: 一、没有使用代理服务器的情况: 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 完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。
下面是一个简单的代码,来演示冒名上述信息,改造自 http://www.cnblogs.com/kingthy/archive/2007/11/24/970783.html 博客的测试代码。
服务器端的 UserIP.ASPX 页面的代码: protected void Page_Load(object sender, EventArgs e) 客户端发送请求的代码: static void Main(string[] args) 测试的结果中的重要信息: 测试的结果数据比较多,我这里只罗列了几个重要的。 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个信息中取舍。
参考资料: LEAD提效之socks代理 获取客户端的真实ip 真正的取真实IP地址及利弊 使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|