1. 程式人生 > >java 防止xss攻擊

java 防止xss攻擊

urn .cn lee lan 轉義 chain archive quest itl

http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html#xsshappen

這裏說下最近項目中我們的解決方案,主要用到commons-lang3-3.1.jar這個包的org.apache.commons.lang3.StringEscapeUtils.escapeHtml4()這個方法。

解決過程主要在用戶輸入和顯示輸出兩步:在輸入時對特殊字符如<>" ‘ & 轉義,在輸出時用jstl的fn:excapeXml("fff")方法。

其中,輸入時的過濾是用一個filter來實現,

實現過程:

在web.xml加一個filter

Xml代碼 技術分享
  1. <filter>
  2. <filter-name>XssEscape</filter-name>
  3. <filter-class>cn.pconline.morden.filter.XssFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>XssEscape</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>

XssFilter 的實現方式是實現servlet的Filter接口

Java代碼 技術分享
  1. package cn.pconline.morden.filter;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10. public class XssFilter implements Filter {
  11. @Override
  12. public void init(FilterConfig filterConfig) throws ServletException {
  13. }
  14. @Override
  15. public void doFilter(ServletRequest request, ServletResponse response,
  16. FilterChain chain) throws IOException, ServletException {
  17. chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
  18. }
  19. @Override
  20. public void destroy() {
  21. }
  22. }

關鍵是XssHttpServletRequestWrapper的實現方式,繼承servlet的HttpServletRequestWrapper,並重寫相應的幾個有可能帶xss攻擊的方法,如:

Java代碼 技術分享
  1. package cn.pconline.morden.filter;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletRequestWrapper;
  4. import org.apache.commons.lang3.StringEscapeUtils;
  5. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  6. public XssHttpServletRequestWrapper(HttpServletRequest request) {
  7. super(request);
  8. }
  9. @Override
  10. public String getHeader(String name) {
  11. return StringEscapeUtils.escapeHtml4(super.getHeader(name));
  12. }
  13. @Override
  14. public String getQueryString() {
  15. return StringEscapeUtils.escapeHtml4(super.getQueryString());
  16. }
  17. @Override
  18. public String getParameter(String name) {
  19. return StringEscapeUtils.escapeHtml4(super.getParameter(name));
  20. }
  21. @Override
  22. public String[] getParameterValues(String name) {
  23. String[] values = super.getParameterValues(name);
  24. if(values != null) {
  25. int length = values.length;
  26. String[] escapseValues = new String[length];
  27. for(int i = 0; i < length; i++){
  28. escapseValues[i] = StringEscapeUtils.escapeHtml4(values[i]);
  29. }
  30. return escapseValues;
  31. }
  32. return super.getParameterValues(name);
  33. }
  34. }

到此為止,在輸入的過濾就完成了。

在頁面顯示數據的時候,只是簡單地用fn:escapeXml()對有可能出現xss漏洞的地方做一下轉義輸出。

復雜內容的顯示,具體問題再具體分析。

另外,有些情況不想顯示過濾後內容的話,可以用StringEscapeUtils.unescapeHtml4()這個方法,把StringEscapeUtils.escapeHtml4()轉義之後的字符恢復原樣。

java 防止xss攻擊