爬虫之验证码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")){//根據網卡取本機配置的IPInetAddress inet=null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}ipAddress= inet.getHostAddress();}}//對于通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按照','分割if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15if(ipAddress.indexOf(",")>0){ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));}} return ipAddress; }?
?我以前搞過這些東西,還訪問各種網站找網站的漏洞,給同學來一個說來就來的短信轟炸。
?
?
?因為以前翹過這些后門,所以給大家說說我的心路歷程,我的爬蟲經歷,希望對大家有幫助。
?
轉載于:https://www.cnblogs.com/Java-web-wy/p/7199973.html
總結
以上是生活随笔為你收集整理的爬虫之验证码IP攻防心得——小总结的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C++设计模式-Factory工厂模式
- 下一篇: json调试
