小前言:
一般來說,現在很多平台注冊、登錄的時候會涉及到驗證碼,這樣做的目的是為了防止惡意程序惡意訪問,從而給服務器造成一定的壓力,會浪費一定的資源,大家也都知道,現在這種短信平台,郵箱平台等都是收費的,如果不做這種防范措施,可能你今晚對某短信平台充值,第二天早上醒來就會收到一條消費多少條短信讓你去充值的信息。不是吹牛,我以前做過這種事的,我還專門去找這種網站,玩一玩短信轟炸,郵箱轟炸等。
言歸正傳,該怎么去防范這種措施呢?
·驗證碼
·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; }
我以前搞過這些東西,還訪問各種網站找網站的漏洞,給同學來一個說來就來的短信轟炸。
因為以前翹過這些后門,所以給大家說說我的心路歷程,我的爬蟲經歷,希望對大家有幫助。