爬蟲之驗證碼IP攻防心得——小總結


小前言:

一般來說,現在很多平台注冊、登錄的時候會涉及到驗證碼,這樣做的目的是為了防止惡意程序惡意訪問,從而給服務器造成一定的壓力,會浪費一定的資源,大家也都知道,現在這種短信平台,郵箱平台等都是收費的,如果不做這種防范措施,可能你今晚對某短信平台充值,第二天早上醒來就會收到一條消費多少條短信讓你去充值的信息。不是吹牛,我以前做過這種事的,我還專門去找這種網站,玩一玩短信轟炸,郵箱轟炸等。

 

 

言歸正傳,該怎么去防范這種措施呢? 

·驗證碼

·IP 

·更多 

當然,所有安全都不是絕對的,安全和方便自古以來都是相生相克,想安全點,就得麻煩一點,想方便一點,就沒那么安全。 

 

 

驗證碼限制: 

 

 

 

現在網上都有很多jar包直接拿來用就行了,或者使用一些開源框架,比如Apache的jcaptcha等等。但是呢,驗證碼限制也是可以破解的,但是驗證碼的防范措施已經阻止了大概70%的惡意程序(本來搞惡意破壞的就不會太多,就算不太多,我們是不是也得防着點)。再說一個額外話題,別人怎么去破解驗證碼呢?驗證碼上面會布滿幾個數字、或者是幾個字母、或者是字母數字的組合、也可能是幾個漢字、等等。破解驗證嗎要用到投影直方圖分割,卡殼法,二值化等技術,比如這張二維碼是4個字母(一般都是這種),把這張圖片分割成4份,每份一個字母,然后使用相應的技術破解驗證碼得到里面的value。所以平時大家所見的驗證碼的背景都會布滿一些條條杠杠,這些不是想擾亂客戶的視線,這是擾亂惡意程序的破解。好了,來說說IP怎么限制吧。 

 

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; 
}

 

 我以前搞過這些東西,還訪問各種網站找網站的漏洞,給同學來一個說來就來的短信轟炸。

 

 

 因為以前翹過這些后門,所以給大家說說我的心路歷程,我的爬蟲經歷,希望對大家有幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM