转自:http://www.cnblogs.com/wangwei/archive/2009/09/19/1570242.html
“ASP.NET网站限制访问频率”的作者遇到了两大问题。一是验证码被破解,二是恶意用户通过使用代理变换IP来摆脱作者的限制。
先说说验证码破解
提起来破解验证码,小菜们肯定都直摇头,觉得那是图形学和算法高手们研究的事情,小菜们只能心有余而力不足。
然而博主使用的验证码其实很容易破掉。打开博主的网站http://freesms.cloudapp.net/Default.aspx,在图片验证码上点击右键然后选择“属性”,可以看到验证码的地址“http://freesms.cloudapp.net/VerifyCode.aspx?”。很奇怪吧,咋地是个aspx页面那!别着急,打开一个浏览器按shift+F2调出httpwatch(很有用的第三方IE插件,请自行获取安装。),点急record打开监控。下面把刚才获取的验证码地址粘贴到地址栏里并按回车访问他。下面是httpwatch抓到的部分返回结果:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: image/Jpeg; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
Set-Cookie: 1945.47704561149=IDNH6; path=/
X-Powered-By: ASP.NET
Date: Sat, 19 Sep 2009 14:28:58 GMT
Content-Length: 8697
请注意这一行“Set-Cookie: 1945.47704561149=IDNH6; path=/”再看看ie里的显示
如下图
诸位看官应该明白怎么回事了吧。VerifyCode.aspx的任务很简单,随意生成一组字母如“IDNH6”然后把它变成图像输出到客户的,并把这组字母以明文的形式保存到cookie里,以便用户提交请求时从cookie中读取并与用户提交的结果进行比较。
要想破解只要在提交post请求时在http头里伪造一个假的cookie值即可。因为校验程序只要确认用户填写的验证码和cookie里的那个(可以伪造)相同就放行。
再谈谈第二个问题“恶意用户通过使用代理变换IP来摆脱作者的限制”。
所谓使用代理来变换IP对大部分asp.net网站其实不需要挂代理就能实现IP的欺骗。
先看一段网上广为流传的获取用户真实IP的实现代码
#region 获取用户真实IP地址
/// <summary>
/// 获取用户真实IP地址
/// </summary>
/// <returns>返回用户真实IP</returns>
public static string GetUserRealrIp()
{
string user_IP = "";
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
{
user_IP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
else
{
user_IP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
}
return user_IP;
}
#endregion
下面演示一下如何伪造一个虚假的访问IP
不多介绍,直接上代码
制造虚假IP的客户的:
Code
getip.aspx
Code
下面是运行结果:
如何避免这种地址获取机制的缺陷,还是请大家各抒己见吧。