2013-04-10 104 views
0

我們正在嘗試在我們的Web應用程序中使用ESAPI。我們在servlet中有以下功能。ESAPI編碼問題

 protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

     response.setContentType("text/html;charset=UTF-8"); 

     response.setHeader(SearchConstants.CACHE_CONTROL_HEADER, 

        SearchConstants.MAX_AGE_ZERO); 

     response.setHeader(SearchConstants.CACHE_CONTROL_HEADER, 

        SearchConstants.NO_CACHE); 

     response.setDateHeader(SearchConstants.EXPIRES_HEADER, 0); 

     response.setHeader(SearchConstants.PRAGMA_HEADER, "no cache"); 

     result = processRequest(request, response); 

     if (SearchConstants.XSLT_ERROR_MSG.equals(result)) { 

       LOGGER.error("XSLT ERROR FOR QUERY STRING: " 

          + request.getQueryString()); 

       response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 

     } else if (SearchConstants.SEARCH_PAGE_MISSING_MSG.equals(result)) { 

       LOGGER.error("NOT FOUND ERROR FOR QUERY STRING: " 

          + request.getQueryString()); 

       response.sendError(HttpServletResponse.SC_NOT_FOUND); 

     } else { 

       final PrintWriter out = response.getWriter(); 
       out.println(result); // this works 
       // out.println(ESAPI.encoder().encodeForHTML(result)); 

     } 

    } 

在上面的代碼,如果我用out.println(ESAPI.encoder().encodeForHTML(result));,這實際上打印HTML作爲瀏覽器的文本。即它顯示爲簡單文本<html>其他內容.. </html>,而不是呈現html頁面。 result只不過是需要在客戶端上獲得百分之百的html內容。 我們在這裏做錯了事。請提供一些指示。我們如何在這裏實現編碼?

回答

4

你的問題的解決方案是不編碼,但到rendere安全的HTML ..下面是解決

import org.owasp.validator.html.*; // Import AntiSamy 

String POLICY_FILE_LOCATION = "antisamy-1.4.1.xml"; // Path to policy file 

String dirtyInput = "<div><script>alert(1);</script></div>"; // Your HTML RESPONSE 

Policy policy = Policy.getInstance(POLICY_FILE_LOCATION); // Create Policy object 

AntiSamy as = new AntiSamy(); // Create AntiSamy object 
CleanResults cr = as.scan(dirtyInput, policy, AntiSamy.SAX); // Scan dirtyInput 

System.out.println(cr.getCleanHTML()); // Do something with your clean output! 

在你編寫代碼確保你有以下:antisamy.jar

這個jar需要如下依賴jar:

  1. xercesImpl.jar
  2. batik.jar
  3. nekohtml.jar

您還需要policy.xml文件。

0

對不起,我沒有時間進入細節,看來你已經有了一個體面的答案。

有一種方法可以在ESAPI中執行此操作。我建議調用Validator.getValidSafeHTML()方法可能是一種方法。該方法實際上使用AntiSamy。查看TestValidator.java JUnit測試應該顯示它的使用方式。不幸的是,該領域的文檔非常缺乏,這是我有時或需要使用的代碼。

如果您不想使用ESAPI,另一種方法是使用OWASP Java HTML Sanitizer Project。它比AntiSamy更快,維護更好,並具有最小的依賴關係(可能爲零)。

希望有幫助, -kevin