爬虫之验证码IP攻防心得——小总结

小前言:缓存

通常来讲,如今不少平台注册、登陆的时候会涉及到验证码,这样作的目的是为了防止恶意程序恶意访问,从而给服务器形成必定的压力,会浪费必定的资源,你们也都知道,如今这种短信平台,邮箱平台等都是收费的,若是不作这种防范措施,可能你今晚对某短信平台充值,次日早上醒来就会收到一条消费多少条短信让你去充值的信息。不是吹牛,我之前作过这种事的,我还专门去找这种网站,玩一玩短信轰炸,邮箱轰炸等。安全

 

 

言归正传,该怎么去防范这种措施呢? 服务器

·验证码网络

·IP session

·更多 框架

固然,全部安全都不是绝对的,安全和方便自古以来都是相生相克,想安全点,就得麻烦一点,想方便一点,就没那么安全。 网站

 

 

验证码限制: spa

 

 

 

如今网上都有不少jar包直接拿来用就好了,或者使用一些开源框架,好比Apache的jcaptcha等等。可是呢,验证码限制也是能够破解的,可是验证码的防范措施已经阻止了大概70%的恶意程序(原本搞恶意破坏的就不会太多,就算不太多,咱们是否是也得防着点)。再说一个额外话题,别人怎么去破解验证码呢?验证码上面会布满几个数字、或者是几个字母、或者是字母数字的组合、也多是几个汉字、等等。破解验证吗要用到投影直方图分割,卡壳法,二值化等技术,好比这张二维码是4个字母(通常都是这种),把这张图片分割成4份,每份一个字母,而后使用相应的技术破解验证码获得里面的value。因此平时你们所见的验证码的背景都会布满一些条条杠杠,这些不是想扰乱客户的视线,这是扰乱恶意程序的破解。好了,来讲说IP怎么限制吧。 3d

 

IP限制:代理

 IP的限制固然是很重要的,固然,这也是能够破解的,这个留到后面说。 什么IP限制呢?你每访问一个网页或者网站,在后台均可以获得你的IP地址,而后在后台把这个IP记住,你连续给某个手机号 发送验证码吵过多少次,就禁止这个IP发送验证码。

 


通常状况,是把这个IP放到缓存里,你发一次短信,相应的值就+1,若是超过某个值,后台就不会给这个手机号或者邮箱发送验证码。若是作得次一点,那就把它放到session里,key的话就是你的ip,值得话就是你发短信的次数。

 

 

不少人很好奇,这个恶意程序怎么破击IP地址呢?IP地址不是惟一的吗? 不知道你们据说过代理没有,也就是恶意程序访问的是代理,而后代理去访问你的网站,而后频繁切换代理访问,因此代理是后台多级反向代理所获得的真实IP, 可能你知道这个IP攻击过你的网站,但是你根本找不到这我的,由于你根本无从下手去找。而后你拿着IP上网查一下,发现这个IP的地址是美国洛杉矶。。。

 

得到客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) { 
  if (request.getHeader("x-forwarded-for") == null) { 
   return request.getRemoteAddr(); 
  } 
  return request.getHeader("x-forwarded-for"); 
 }

 

 得到客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) { 
       String ip = request.getHeader("x-forwarded-for"); 
       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
           ip = request.getHeader("Proxy-Client-IP"); 
       } 
       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
           ip = request.getHeader("WL-Proxy-Client-IP"); 
       } 
       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
           ip = request.getRemoteAddr(); 
       } 
       return ip; 
   }

 

 以上方法还不行的话就采用以下方法:

/**
 * 获取当前网络ip
 * @param request
 * @return
 */
public String getIpAddr(HttpServletRequest request){
	String ipAddress = request.getHeader("x-forwarded-for");
	if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
		ipAddress = request.getHeader("Proxy-Client-IP");
	}
	if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
		ipAddress = request.getHeader("WL-Proxy-Client-IP");
	}
	if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
		ipAddress = request.getRemoteAddr();
		if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){
			//根据网卡取本机配置的IP
			InetAddress inet=null;
			try {
				inet = InetAddress.getLocalHost();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			}
		ipAddress= inet.getHostAddress();
	}
	}
	//对于经过多个代理的状况,第一个IP为客户端真实IP,多个IP按照','分割
	if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15
		if(ipAddress.indexOf(",")>0){
			ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));
		}
	}
return ipAddress; 
}

 

 我之前搞过这些东西,还访问各类网站找网站的漏洞,给同窗来一个说来就来的短信轰炸。

 

 

 由于之前翘过这些后门,因此给你们说说个人心路历程,个人爬虫经历,但愿对你们有帮助。

相关文章
相关标签/搜索