爬虫之验证码IP攻防心得——小总结
小前言:
一般來說,現(xiàn)在很多平臺(tái)注冊(cè)、登錄的時(shí)候會(huì)涉及到驗(yàn)證碼,這樣做的目的是為了防止惡意程序惡意訪問,從而給服務(wù)器造成一定的壓力,會(huì)浪費(fèi)一定的資源,大家也都知道,現(xiàn)在這種短信平臺(tái),郵箱平臺(tái)等都是收費(fèi)的,如果不做這種防范措施,可能你今晚對(duì)某短信平臺(tái)充值,第二天早上醒來就會(huì)收到一條消費(fèi)多少條短信讓你去充值的信息。不是吹牛,我以前做過這種事的,我還專門去找這種網(wǎng)站,玩一玩短信轟炸,郵箱轟炸等。
?
?
言歸正傳,該怎么去防范這種措施呢??
·驗(yàn)證碼
·IP?
·更多?
當(dāng)然,所有安全都不是絕對(duì)的,安全和方便自古以來都是相生相克,想安全點(diǎn),就得麻煩一點(diǎn),想方便一點(diǎn),就沒那么安全。?
?
?
驗(yàn)證碼限制:?
?
?
?
現(xiàn)在網(wǎng)上都有很多jar包直接拿來用就行了,或者使用一些開源框架,比如Apache的jcaptcha等等。但是呢,驗(yàn)證碼限制也是可以破解的,但是驗(yàn)證碼的防范措施已經(jīng)阻止了大概70%的惡意程序(本來搞惡意破壞的就不會(huì)太多,就算不太多,我們是不是也得防著點(diǎn))。再說一個(gè)額外話題,別人怎么去破解驗(yàn)證碼呢?驗(yàn)證碼上面會(huì)布滿幾個(gè)數(shù)字、或者是幾個(gè)字母、或者是字母數(shù)字的組合、也可能是幾個(gè)漢字、等等。破解驗(yàn)證嗎要用到投影直方圖分割,卡殼法,二值化等技術(shù),比如這張二維碼是4個(gè)字母(一般都是這種),把這張圖片分割成4份,每份一個(gè)字母,然后使用相應(yīng)的技術(shù)破解驗(yàn)證碼得到里面的value。所以平時(shí)大家所見的驗(yàn)證碼的背景都會(huì)布滿一些條條杠杠,這些不是想擾亂客戶的視線,這是擾亂惡意程序的破解。好了,來說說IP怎么限制吧。?
?
IP限制:
?IP的限制當(dāng)然是很重要的,當(dāng)然,這也是可以破解的,這個(gè)留到后面說。 什么IP限制呢?你每訪問一個(gè)網(wǎng)頁或者網(wǎng)站,在后臺(tái)都可以得到你的IP地址,然后在后臺(tái)把這個(gè)IP記住,你連續(xù)給某個(gè)手機(jī)號(hào) 發(fā)送驗(yàn)證碼吵過多少次,就禁止這個(gè)IP發(fā)送驗(yàn)證碼。
?
一般情況,是把這個(gè)IP放到緩存里,你發(fā)一次短信,相應(yīng)的值就+1,如果超過某個(gè)值,后臺(tái)就不會(huì)給這個(gè)手機(jī)號(hào)或者郵箱發(fā)送驗(yàn)證碼。如果做得次一點(diǎn),那就把它放到session里,key的話就是你的ip,值得話就是你發(fā)短信的次數(shù)。
?
很多人很好奇,這個(gè)惡意程序怎么破擊IP地址呢?IP地址不是唯一的嗎? 不知道大家聽說過代理沒有,也就是惡意程序訪問的是代理,然后代理去訪問你的網(wǎng)站,然后頻繁切換代理訪問,所以代理是后臺(tái)多級(jí)反向代理所得到的真實(shí)IP, 可能你知道這個(gè)IP攻擊過你的網(wǎng)站,可是你根本找不到這個(gè)人,因?yàn)槟愀緹o從下手去找。然后你拿著IP上網(wǎng)查一下,發(fā)現(xiàn)這個(gè)IP的地址是美國洛杉磯。。。
?
獲得客戶端真實(shí)IP地址的方法一:
public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); }?
?獲得客戶端真實(shí)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; }?
?以上方法還不行的話就采用如下方法:
/*** 獲取當(dāng)前網(wǎng)絡(luò)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")){//根據(jù)網(wǎng)卡取本機(jī)配置的IPInetAddress inet=null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}ipAddress= inet.getHostAddress();}}//對(duì)于通過多個(gè)代理的情況,第一個(gè)IP為客戶端真實(shí)IP,多個(gè)IP按照','分割if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15if(ipAddress.indexOf(",")>0){ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));}} return ipAddress; }?
?我以前搞過這些東西,還訪問各種網(wǎng)站找網(wǎng)站的漏洞,給同學(xué)來一個(gè)說來就來的短信轟炸。
?
?
?因?yàn)橐郧奥N過這些后門,所以給大家說說我的心路歷程,我的爬蟲經(jīng)歷,希望對(duì)大家有幫助。
?
轉(zhuǎn)載于:https://www.cnblogs.com/Java-web-wy/p/7199973.html
總結(jié)
以上是生活随笔為你收集整理的爬虫之验证码IP攻防心得——小总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++设计模式-Factory工厂模式
- 下一篇: json调试