Java 我可以在scriptlet和JSTL之间传递以转义XML吗?

Java 我可以在scriptlet和JSTL之间传递以转义XML吗?,java,jsp,jstl,xss,Java,Jsp,Jstl,Xss,我有一个JSP脚本,它接受必须是XML转义的GET参数,以防止XSS漏洞。由于Java没有内置的XSS转义函数,所以我尝试将其传递给JSTL的fn:escapeXml(),然后返回到scriptlet,如下所示: <%@ (import fn taglib) %> <% String var1 = request.getParameter("input"); request.setAttribute("var1",var1); %> <c:set var="var1

我有一个JSP脚本,它接受必须是XML转义的GET参数,以防止XSS漏洞。由于Java没有内置的XSS转义函数,所以我尝试将其传递给JSTL的
fn:escapeXml()
,然后返回到scriptlet,如下所示:

<%@ (import fn taglib) %>
<%
String var1 = request.getParameter("input");
request.setAttribute("var1",var1);
%>
<c:set var="var1" scope="request" value="${fn:escapeXml(var1)}" />
<%
var1 = request.getAttribute("var1");
%>


当我尝试此操作时,服务器会返回非常有用的“500:内部服务器错误”。在我花一天时间解决此问题之前,我想我会问专家:这是否有效?我提供的代码中是否存在明显的错误,或者我是否应该在其他地方寻找问题?谢谢

从概念上讲,提出的方法应该有效。错误在于变量在通过JSTL传递时不保留其类型。将它们转换回
String
可修复此问题:

<%@ (import fn taglib) %>
<%
String var1 = request.getParameter("input");
request.setAttribute("var1",var1);
%>
<c:set var="var1" scope="request" value="${fn:escapeXml(var1)}" />
<%
var1 = (String)request.getAttribute("var1");
%>


扔掉scriptlet代码,开心一点……只有在浏览器中输出内容时,才需要转义XML以防止XSS。如果您的
var1
变量有一些HTML,但您只在Java代码中使用它,而不打印到JSP,则不需要在那里转义XML