URLEncoder.encode(字符串,"UTF-8")验证不好吗?

Sri*_*har 1 java security xss fortify

在我的J2EE/Java代码的一部分中,我在输出上执行URLEncoding getRequestURI()来清理它以防止XSS攻击,但Fortify SCA认为验证不好.

为什么?

Bal*_*usC 6

关键是您需要将HTML特殊字符转换为HTML实体.这也称为"HTML转义"或"XML转义".基本上,字符<,>,",&'需要被替换&lt;,&gt;,&quot;,&amp;&#39;.

URL编码不会这样做.URL编码将URL特殊字符转换为百分比编码值.这不是HTML转义.

对于Web应用程序,HTML转义通常在视图侧完成,正好在那里您重新显示用户控制的输入.对于Java EE Web应用程序,这取决于您正在使用的视图技术.

  1. 如果webapp使用现代Facelets视图技术,那么您不需要自己转义它.Facelets已经暗中这样做了.

  2. 如果webapp使用的是旧版JSP视图技术,那么您需要确保使用JSTL <c:out>标记或fn:escapeXml()函数重新显示用户控制的输入.

    <c:out value="${bean.foo}" />
    <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果webapp是非常遗留或设计不好并使用servlet或scriptlet来打印HTML,那么你就会遇到更大的问题.没有内置标记或函数,更不用说可以转义HTML实体的Java方法了.您应该escape()自己编写一些方法,或者使用Apache Commons Lang StringEscapeUtils#escapeHtml().然后,您需要确保在打印用户控制的输入的任何地方使用它.

    out.print("<p>" + StringEscapeUtils.escapeHtml(request.getParameter("foo")) + "</p>");
    
    Run Code Online (Sandbox Code Playgroud)

    更好的方法是重新设计遗留的webapp以将JSP与JSTL结合使用.