【问题标题】:ESAPI encoding issueESAPI 编码问题
【发布时间】:2013-04-10 13:19:06
【问题描述】:

我们正在尝试在我们的网络应用程序中使用 ESAPI。我们在 servlet 中有以下函数。

        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 内容。 我们在这里做错了什么。请提供一些指示。我们如何在这里实现编码?

【问题讨论】:

    标签: esapi


    【解决方案1】:

    解决您问题的方法不是编码,而是渲染 Safe 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. 蜡染.jar
    3. nekohtml.jar

    您还需要policy.xml 文件。

    【讨论】:

      【解决方案2】:

      抱歉,我没有时间详细说明,看来您已经有了一个不错的答案。

      在 ESAPI 中有一种方法可以做到这一点。我建议调用Validator.getValidSafeHTML() 方法可能是一种方法。该方法实际上使用了 AntiSamy。查看 TestValidator.java JUnit 测试应该显示它是如何使用的。不幸的是,该领域的文档非常缺乏,而且我有机会或需要使用它的代码。

      如果您不想使用 ESAPI,另一种方法是使用 OWASP Java HTML Sanitizer Project。它比 AntiSamy 更快,维护得更好,并且依赖关系最小(可能为零)。

      希望对您有所帮助, -凯文

      【讨论】:

        猜你喜欢
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多