request.getParameter如何防止XSS攻击:最佳实践是什么?

4
我继承了一个包含1000多个JSP文件的大型代码库,其中充满了XSS漏洞。
代码中充满了

标签。

<%= request.getParameter("theparam")%>

并且

out.println("some stuff before"+request.getParameter("theparam")+"and some other stuff");

并且

String myVar = request.getParameter("theparam");
out.println(myVar);

我想要保护所有文件,而不必逐个文件进行操作。
我的最佳方法是什么?
  • 在所有源文件中对“request.getParameter(“xx”)”执行“全部替换”操作,将其替换为“StringEscapeUtils.escapeHtml(request.getParameter(“xx”))”?

  • 我能否以某种方式覆盖函数“request.getParameter”,使其默认为stringescapeutils.escapehtml(request.getParameter(“”))?

谢谢。
2个回答

3
我并不是说这是最好的方法,但可以通过使用Servlet过滤器和封装HTTP Servlet请求来轻松实现:

我是否可以以某种方式覆盖函数“request.getParameter”,使其默认为“stringescapeutils.escapehtml(request.getParameter(“”))”?

这种方法在如何向HttpServletRequest添加验证逻辑中有所描述。
然而,最全面的方法是在显示时进行转义,最好只在JSP中进行转义。很遗憾,你也在Servlet中生成HTML。请参见:Java 5 HTML escaping To Prevent XSS

1
有没有正则表达式专家?我想将所有出现的 request.getParameter("thischangesallthetime") 替换为 stringescapeutils.escapehtml(request.getParameter("")); 我能用正则表达式替换吗? - user1194465
@user1194465:当然可以,但请发布另一个问题(也许更适合在超级用户上?),并在此跟进。此外,我不确定这是否是一个好方法——应该在显示参数时转义,而不是在读取时转义。 - Tomasz Nurkiewicz
好的,我已经完成了这个任务 [http://stackoverflow.com/questions/11500695/notepad-regulare-expression-to-replace]。 - user1194465

0
你可以像下面这样做。
<%@ page import="org.apache.commons.lang.StringEscapeUtils" %>
String str=request.getParameter("urlParam");
String safeOuput = StringEscapeUtils.escapeXml(str);

希望这能帮助您解决问题...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接