小前言:緩存
通常來講,如今不少平臺註冊、登陸的時候會涉及到驗證碼,這樣作的目的是爲了防止惡意程序惡意訪問,從而給服務器形成必定的壓力,會浪費必定的資源,你們也都知道,如今這種短信平臺,郵箱平臺等都是收費的,若是不作這種防範措施,可能你今晚對某短信平臺充值,次日早上醒來就會收到一條消費多少條短信讓你去充值的信息。不是吹牛,我之前作過這種事的,我還專門去找這種網站,玩一玩短信轟炸,郵箱轟炸等。安全
言歸正傳,該怎麼去防範這種措施呢? 服務器
·驗證碼網絡
·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; }
我之前搞過這些東西,還訪問各類網站找網站的漏洞,給同窗來一個說來就來的短信轟炸。
由於之前翹過這些後門,因此給你們說說個人心路歷程,個人爬蟲經歷,但願對你們有幫助。