思路: 判斷referer裡的地址是否和當前的地址一致,如果不一致則說明是跨域攻擊的,否則不是
/** * 驗證請求的合法性,防止跨域攻擊 * * @param request * @return */@SuppressWarnings("rawtypes")publicstatic boolean validateRequest(HttpServletRequest request) { String referer = ""; booleanreferer_sign = true;// true 站內提交,驗證通過 //false 站外提交,驗證失敗 Enumeration headerValues = request.getHeaders("referer"); while(headerValues.hasMoreElements()) { referer = (String) headerValues.nextElement(); } // 判斷是否存在請求頁面 if(StringUtils.isBlank(referer)) referer_sign = false; else{ // 判斷請求頁面和getRequestURI是否相同 String servername_str = request.getServerName(); if(StringUtils.isNotBlank(servername_str)) { intindex = 0; if(StringUtils.indexOf(referer, "https://") == 0) { index = 8; } elseif (StringUtils.indexOf(referer, "http://") == 0) { index = 7; } if(referer.length() - index < servername_str.length()) {// 長度不夠 referer_sign = false; } else{ // 比較字串(主機名稱)是否相同 String referer_str = referer.substring(index, index + servername_str.length()); if(!servername_str.equalsIgnoreCase(referer_str)) referer_sign = false; } } elsereferer_sign = false; } returnreferer_sign;}
原文地址:http://www.mspring.org/post/241.html