1. 程式人生 > >java 防止 XSS 攻擊的常用方法總結.

java 防止 XSS 攻擊的常用方法總結.

在前面的一篇文章中,講到了java web應用程式防止 csrf 攻擊的方法,參考這裡 java網頁程式採用 spring 防止 csrf 攻擊. ,但這只是攻擊的一種方式,還有其他方式,比如今天要記錄的 XSS 攻擊, XSS 攻擊的專業解釋,可以在網上搜索一下,參考百度百科的解釋 http://baike.baidu.com/view/2161269.htm, 但在實際的應用中如何去防止這種攻擊呢,下面給出幾種辦法.
1. 自己寫 filter 攔截來實現,但要注意的時,在WEB.XML 中配置 filter 的時候,請將這個 filter 放在第一位.
2. 採用開源的實現 ESAPI library ,參考網址:
https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API

3. 可以採用spring 裡面提供的工具類來實現.

一, 第一種方法。
配置過濾器
publicclassXSSFilterimplementsFilter{@Overridepublicvoid init(FilterConfig filterConfig)throwsServletException{}@Overridepublicvoid destroy(){}@Overridepublicvoid doFilter(ServletRequest request
,ServletResponse response,FilterChain chain)throwsIOException,ServletException{         chain.doFilter(newXSSRequestWrapper((HttpServletRequest) request), response);}}


再實現 ServletRequest 的包裝類
import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper
;publicclassXSSRequestWrapperextendsHttpServletRequestWrapper{publicXSSRequestWrapper(HttpServletRequest servletRequest){super(servletRequest);}@OverridepublicString[] getParameterValues(String parameter){String[] values =super.getParameterValues(parameter);if(values ==null){returnnull;}int count = values.length;String[] encodedValues =newString[count];for(int i =0; i < count; i++){             encodedValues[i]= stripXSS(values[i]);}return encodedValues;}@OverridepublicString getParameter(String parameter){String value =super.getParameter(parameter);return stripXSS(value);}@OverridepublicString getHeader(String name){String value =super.getHeader(name);return stripXSS(value);}privateString stripXSS(String value){if(value !=null){// NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to// avoid encoded attacks.// value = ESAPI.encoder().canonicalize(value);// Avoid null characters             value = value.replaceAll("","");// Avoid anything between script tagsPattern scriptPattern =Pattern.compile("(.*?)",Pattern.CASE_INSENSITIVE);             value = scriptPattern.matcher(value).replaceAll("");// Avoid anything in a src="http://www.yihaomen.com/article/java/..." type of e­xpression             scriptPattern =Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE |Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");             scriptPattern =Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE |Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome tag             scriptPattern =Pattern.compile("",Pattern.CASE_INSENSITIVE);             value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome tag             scriptPattern =Pattern.compile("",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE |Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");// Avoid eval(...) e­xpressions             scriptPattern =Pattern.compile("eval\\((.*?)\\)",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE |Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");// Avoid e­xpression(...) e­xpressions             scriptPattern =Pattern.compile("e­xpression\\((.*?)\\)",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE |Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");// Avoid javascript:... e­xpressions             scriptPattern =Pattern.compile("javascript:",Pattern.CASE_INSENSITIVE);             value = scriptPattern.matcher(value).replaceAll("");// Avoid vbscript:... e­xpressions             scriptPattern =Pattern.compile("vbscript:",Pattern.CASE_INSENSITIVE);             value = scriptPattern.matcher(value).replaceAll("");// Avoid onload= e­xpressions             scriptPattern =Pattern.compile("onload(.*?)=",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE |Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");}return value;}}


例子中註釋的部分,就是採用 ESAPI library 來防止XSS攻擊的,推薦使用.

當然,我還看到這樣一種辦法,將所有的程式設計全形字元的解決方式,但個人覺得並沒有上面這種用正則表示式替換的好

privatestaticString xssEncode(String s){if(s ==null|| s.equals("")){return s;}StringBuilder sb =newStringBuilder(s.length()+16);for(int i =0; i < s.length(); i++){char c = s.charAt(i);switch(c){case'>':
                sb.append('>');// 全形大於號break;case'<':
                sb.append('<');// 全形小於號break;case'\'':
                sb.append('\\');
                sb.append('\'');
                sb.append('\\');
                sb.append('\'');break;case
            
           

相關推薦

java 防止 XSS 攻擊常用方法總結.

在前面的一篇文章中,講到了java web應用程式防止 csrf 攻擊的方法,參考這裡 java網頁程式採用 spring 防止 csrf 攻擊. ,但這只是攻擊的一種方式,還有其他方式,比如今天要記錄的 XSS 攻擊, XSS 攻擊的專業解釋,可以在網上搜索一下,參考百

java 防止 XSS 攻擊常用方法總結

import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class XSSReques

java 防止 XSS 攻擊常用方法

javax 編程 cape sap ins servlet space javascrip throws 1. 自己寫 filter 攔截來實現,但要註意的時,在WEB.XML 中配置 filter 的時候,請將這個 filter 放在第一位.2. 采用開源的實現 ESAP

java 防止xss攻擊

urn .cn lee lan 轉義 chain archive quest itl http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html#xsshappen 這裏說下最近項目中我們的解決方案,

Java防止XSS攻擊

stream false end public catch while one 數據 tro 方法一: 1.添加XssFilter @Configuration public class XssFilter implements Filter { @Overr

Java-String類的常用方法總結

一、String類 String類在java.lang包中,java使用String類建立一個字串變數,字串變數屬於物件。java把String類宣告的final類,不能有類。String類物件建立後不能修改,由0或多個字元組成,包含在一對雙引號之間。二、String類物件的建立 字串宣告:Stri

Java集合類Collections常用方法總結

public class CollectionsTest { public static void main(String[] args) { List<Integer> list = new ArrayList<In

php防止xss攻擊方法

其實就是過濾從表單提交來的資料,使用php過濾函式就可以達到很好的目的。 <?php   if (isset($_POST['name'])){       $str = trim($_POST['name']);  //清理空格     $str = stri

java介面防止XSS攻擊常用方法總結

在前面的一篇文章中,講到了java web應用程式防止 csrf 攻擊的方法,參考這裡 java網頁程式採用 spring 防止 csrf 攻擊. ,但這只是攻擊的一種方式,還有其他方式,比如今天要記錄的 XSS 攻擊, XSS 攻擊的專業解釋,可以在網上搜索一下,參考百度百

java防止跨站點XSS攻擊方法

com.frameworkset.common.filter.CharsetEncodingFilter CharsetEncodingFilter是不具備防止跨站攻擊功能的,但是為其增加兩個init-param引數後就可以了:     wallfilterrules 指定

Java實用方法整理(十七)——File類常用方法總結

一,建立功能 1,public boolean createNewFile() throws IOException     建立新檔案 2,public boolean mkdirs()    建立新的目錄,若父目錄不存在,會自動建立 3,public boolean

java防止xss注入攻擊

後面附錄有三個.java文件 1.把文件拷進專案中(最好建立一個單獨的包存放),然後修改引入路徑,看到不報錯那麼第一步完成。 2.開啟web.xml配置檔案 <!--XSS注入攻擊--> <filter> <filter-name&

JAVA多執行緒機制第四彈:(末篇)執行緒常用方法總結和執行緒同步

執行緒的常用方法: 這裡我覺得這個老師的教案總結的很舒胡(主要是懶~):  執行緒同步: 在處理多執行緒問題時,有一個Bug問題啊:當兩個或多個執行緒同時訪問一個父類變數時,並且一個執行緒需要修改這個變數,(一個執行緒讓變數A增加,另一個執行緒讓變數A減少)。 所

Java Web使用過濾器防止Xss攻擊,解決Xss漏洞

web.xml新增過濾器 <!-- 解決xss漏洞 --> <filter> <filter-name>xssFilter</filter-nam

django 防止xss攻擊標記為安全的二種方法

str='<a href="/page?page=1">1</a>' 一,在前端模板語言中實現,只須用到幫助函式safe.如:   {{ str|safe }}   二,在後端views中實現:   from django.utils.safestring impo

JAVA中sort()常用方法總結

一、Arrays.sort()的用法 import java.util.Arrays; public class Main{ public static void main(String args[

[前端]防止xss攻擊的最簡單方法

xss攻擊:跨站指令碼攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS。惡意攻

java字串和常用方法總結

Java字串類(java.lang.String) String 類的常用的建立方式一般兩種 1、String s1=”abc”; 2、String s2=new String(“abc”); 這兩中方式區別在於 : 1中先是在常量池檢查是否有這個字串

java防止xss指令碼注入攻擊,採用spring工具類方式

XSSRequestWrapper.java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.ap

java中陣列常用方法總結

Java和C陣列的一些異同: 相同點:陣列名都是首元素的地址 不同點:C語言宣告變數可以直接定義陣列長度,java不可以                 java只有在為陣列分配變數時,可以宣告陣列長度                 java:int  [] a;