antisamy的配置以及使用實現XSS防禦

一、maven、antisamy介紹以及XSS:

  antisamy是owasp的開源項目,它用來確保用戶輸入的HTML/CSS符合應用規範的API,可以有效防止xss攻擊。它提供了用於驗證用戶輸入的富文本以防禦跨站腳本的API,適用於java編寫的web項目。它提供了一些標準策略文件,根據自己產品的實際需求,在此基礎上配置一份適合自己產品的策略文件。

具體參考

http://anquan.163.com/module/pedia/article-00016.html

二、所需的相關文件:


三、antisamy在eclipse的配置

    

注意Tomcat應用服務器的安裝。具體詳見 http://jingyan.baidu.com/article/3065b3b6efa9d7becff8a4c6.html

轉換爲maven項目後發現在Libraries下爲發現maven的下拉菜單,如下圖所示:

解決方法:

修改pom.xml中的代碼,即增加以下代碼:

[html] view plain copy
  1. <dependencies>  
  2.    <dependency>  
  3.        <groupId>log4j</groupId>  
  4.        <artifactId>log4j</artifactId>  
  5.        <version>1.2.12</version>  
  6.    </dependency>  
  7.    <dependency>  
  8.        <groupId>org.owasp.antisamy</groupId>  
  9.        <artifactId>antisamy</artifactId>  
  10.        <version>1.5.3</version>  
  11.    </dependency>  
  12. lt;/dependencies>  
保存後刷新項目即可以看到maven下出現了相關的jar文件,即已經將該jar包進行了下載,而不需要自己在下載在加入path路徑:


此時,即將maven和antisamy配置完成。

整體截圖:


pom.xml代碼:

[plain] view plain copy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  2.   <modelVersion>4.0.0</modelVersion>  
  3.   <groupId>webTest</groupId>  
  4.   <artifactId>webTest</artifactId>  
  5.   <version>0.0.1-SNAPSHOT</version>  
  6.   <packaging>war</packaging>  
  7.   <build>  
  8.     <sourceDirectory>src</sourceDirectory>  
  9.     <resources>  
  10.       <resource>  
  11.         <directory>src</directory>  
  12.         <excludes>  
  13.           <exclude>**/*.java</exclude>  
  14.         </excludes>  
  15.       </resource>  
  16.     </resources>  
  17.     <plugins>  
  18.       <plugin>  
  19.         <artifactId>maven-compiler-plugin</artifactId>  
  20.         <version>3.3</version>  
  21.         <configuration>  
  22.           <source>1.8</source>  
  23.           <target>1.8</target>  
  24.         </configuration>  
  25.       </plugin>  
  26.       <plugin>  
  27.         <artifactId>maven-war-plugin</artifactId>  
  28.         <version>2.6</version>  
  29.         <configuration>  
  30.           <warSourceDirectory>WebContent</warSourceDirectory>  
  31.           <failOnMissingWebXml>false</failOnMissingWebXml>  
  32.         </configuration>  
  33.       </plugin>  
  34.     </plugins>  
  35.    </build>  
  36.     <dependencies>  
  37.         <dependency>  
  38.             <groupId>log4j</groupId>  
  39.             <artifactId>log4j</artifactId>  
  40.             <version>1.2.12</version>  
  41.         </dependency>  
  42.         <dependency>  
  43.             <groupId>org.owasp.antisamy</groupId>  
  44.             <artifactId>antisamy</artifactId>  
  45.             <version>1.5.3</version>  
  46.         </dependency>  
  47.     </dependencies>  
  48. </project>  

增加了以下代碼:


四、tomcat安裝

這裏依賴於【eclipse創建javaweb項目的環境配置】

具體參見http://blog.csdn.net/redarmy_chen/article/details/7048317

也可以參照以下鏈接安裝和部署:

http://jingyan.baidu.com/article/3065b3b6efa9d7becff8a4c6.html

需要注意的是在添加目錄時要採用英文名。


五、代碼

XssFilter.java代碼如下:(注意代碼的包的)

[java] view plain copy
  1. import java.io.IOException;  
  2. import javax.servlet.Filter;  
  3. import javax.servlet.FilterChain;  
  4. import javax.servlet.FilterConfig;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.ServletRequest;  
  7. import javax.servlet.ServletResponse;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. public class XssFilter implements Filter {    
  10. @SuppressWarnings("unused")    
  11. private FilterConfig filterConfig;    
  12. public void destroy() {    
  13.     this.filterConfig = null;    
  14. }    
  15. public void doFilter(ServletRequest request, ServletResponse response,    
  16.         FilterChain chain) throws IOException, ServletException {    
  17.     chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);    
  18. }    
  19. public void init(FilterConfig filterConfig) throws ServletException {    
  20.     this.filterConfig = filterConfig;    
  21. }       
  22. }   

相關代碼的註釋可以參見:

http://blog.csdn.net/goskalrie/article/details/51350736

RequestWrapper.java代碼:

[java] view plain copy
  1. import java.util.Iterator;  
  2. import java.util.Map;  
  3.   
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletRequestWrapper;  
  6.   
  7. import org.owasp.validator.html.AntiSamy;  
  8. import org.owasp.validator.html.CleanResults;  
  9. import org.owasp.validator.html.Policy;  
  10. import org.owasp.validator.html.PolicyException;  
  11. import org.owasp.validator.html.ScanException;  
  12.   
  13. public class RequestWrapper extends HttpServletRequestWrapper {  
  14.   
  15.     public RequestWrapper(HttpServletRequest request) {  
  16.         super(request);  
  17.     }  
  18.       
  19.     @SuppressWarnings({ "rawtypes""unchecked" })  
  20.     public Map<String,String[]> getParameterMap(){  
  21.         Map<String,String[]> request_map = super.getParameterMap();  
  22.         Iterator iterator = request_map.entrySet().iterator();  
  23.         while(iterator.hasNext()){  
  24.             Map.Entry me = (Map.Entry)iterator.next();  
  25.             //System.out.println(me.getKey()+":");  
  26.             String[] values = (String[])me.getValue();  
  27.             for(int i = 0 ; i < values.length ; i++){  
  28.                 System.out.println(values[i]);  
  29.                 values[i] = xssClean(values[i]);  
  30.             }  
  31.         }  
  32.         return request_map;  
  33.     }  
  34.       
  35.     @SuppressWarnings({ "rawtypes""unchecked" })  
  36.     public String getParameter(String name) {  
  37.         String v=super.getParameter(name);  
  38.         if(v==null)  
  39.             return null;  
  40.         return xssClean(v);  
  41.     }  
  42.       
  43.     @SuppressWarnings({ "rawtypes""unchecked" })  
  44.     public String[] getParameterValues(String name) {  
  45.         String[] v=super.getParameterValues(name);  
  46.         if(v==null || v.length==0)  
  47.             return v;  
  48.         for(int i=0;i<v.length;i++){  
  49.                 v[i]=xssClean(v[i]);  
  50.         }  
  51.         return v;  
  52.     }  
  53.   
  54.     private String xssClean(String value) {  
  55.         AntiSamy antiSamy = new AntiSamy();  
  56.         try {  
  57.             Policy policy = Policy.getInstance("/antisamy-slashdot.xml");  
  58.             //CleanResults cr = antiSamy.scan(dirtyInput, policyFilePath);   
  59.             final CleanResults cr = antiSamy.scan(value, policy);  
  60.             //瀹夊叏鐨凥TML杈撳嚭  
  61.               
  62.             System.out.println("clean:"+cr.getCleanHTML());  
  63.               
  64.             return cr.getCleanHTML();  
  65.         } catch (ScanException e) {  
  66.             e.printStackTrace();  
  67.         } catch (PolicyException e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.         return value;  
  71.     }  
  72. }  

web.xml代碼:

[plain] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     id="WebApp_ID" version="2.5">  
  6.     <display-name>sdl</display-name>  
  7.     <!-- XSS -->  
  8.     <filter>  
  9.         <filter-name>XSS</filter-name>  
  10.         <filter-class>XssFilter</filter-class>  
  11.     </filter>  
  12.   
  13.     <filter-mapping>  
  14.         <filter-name>XSS</filter-name>  
  15.         <url-pattern>/*</url-pattern>  
  16.     </filter-mapping>  
  17.     <welcome-file-list>  
  18.         <welcome-file>index.html</welcome-file>  
  19.         <welcome-file>index.htm</welcome-file>  
  20.         <welcome-file>index.jsp</welcome-file>  
  21.         <welcome-file>default.html</welcome-file>  
  22.         <welcome-file>default.htm</welcome-file>  
  23.         <welcome-file>default.jsp</welcome-file>  
  24.     </welcome-file-list>  
  25. </web-app>  


六、驗證


htmlTest.html代碼

[html] view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <meta charset="UTF-8">  
  5. <title>Insert title here</title>  
  6. </head>  
  7. <body>  
  8. <form action="main.jsp" method="POST">  
  9. First Name: <input type="text" name="first_name">  
  10. <br />  
  11. Last Name: <input type="text" name="last_name" />  
  12. <input type="submit" value="Submit" />  
  13. </form>  
  14. </body>  
  15. </html>  

如下所示:


main.jsp代碼:

[plain] view plain copy
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  7. <title>Insert title here</title>  
  8. </head>  
  9. <body>  
  10. <center>  
  11. <h1>Using GET Method to Read Form Data</h1>  
  12. <ul>  
  13. <li><p><b>First Name:</b>  
  14.    <%= request.getParameter("first_name")%>  
  15. </p></li>  
  16. <li><p><b>Last  Name:</b>  
  17.    <%= request.getParameter("last_name")%>  
  18. </p></li>  
  19. </ul>  
  20. </body>  
  21. </html>  

如下所示:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章