我们正在尝试在我们的网络应用中使用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内容,需要在客户端获得rendred。
我们在这里做错了。请提供一些指示。我们如何在这里实现编码?
答案 0 :(得分:4)
您的问题的解决方案不是编码,而是渲染安全HTM ..以下是解决方案
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
。
这个罐需要以下依赖的罐子:
您还需要policy.xml
个文件。
答案 1 :(得分:0)
抱歉,我没有时间详细介绍,看来你已经有了不错的答案。
有一种方法可以在ESAPI中执行此操作。我建议调用Validator.getValidSafeHTML()方法可能是一种方法。该方法实际上使用AntiSamy。通过TestValidator.java查看JUnit测试应该显示它是如何使用的。不幸的是,该领域的文档非常缺乏,而且是我曾经或者需要使用的代码。
如果您不想使用ESAPI,另一种方法是使用OWASP Java HTML Sanitizer Project。它比AntiSamy更快,维护得更好,并且具有最小的依赖性(可能为零)。
希望有所帮助, -kevin