在files.jsp中我使用了以下锚点和JSTL c:url组合 -
<c:url value="downloadfile.jsp" var="dwnUrl" scope="request">
<c:param name="fileType" value="PDF"/>
<c:param name="fileId" value="${file.fileId}"/>
<c:param name="fileName" value="${file.fileName}"/>
</c:url>
<a href="${dwnUrl}">Download</a>
在downloadfile.jsp上获取JavaScript变量中的文件名值 -
selectedFile = <c:out value='${param.fileName}'>
现在,如果文件名包含一些额外的字符,例如 XYZ 2/3“技术然后在另一页上,我得到一些不同的角色 - XYZ 2/3#034;技术
但是,如果我打印request.getParameter(“fileName”),它给出正确的名称。有什么问题?
答案 0 :(得分:1)
默认情况下,<c:out>
会转义XML entities,例如双引号。这样做是为了获得格式良好的XML并避免XSS。
要解决这个问题,你应该摆脱<c:out>
,因为JSP 2.0,EL在模板文本中也能很好地工作:
selectedFile = '${param.fileName}';
..或者,如果您仍在旧版JSP 1.2或更早版本上,请将其escapeXml
属性设置为false
:
selectedFile = '<c:out value="${param.fileName}" escapeXml="false">';
请注意,我添加了单引号和分号以使JS代码有效。
毋庸置疑,如果你这样做,你需要记住XSS的风险。
答案 1 :(得分:0)
<c:param>
值中的时髦字符正由<c:url>
进行URL编码。就downloadfile.jsp
而言,servlet容器负责处理传入变量的URL,因此您不必这样做。这是正常行为,不应对您造成任何问题。
答案 2 :(得分:0)
如果你只是像@BalusC建议的那样将escapeXml转为false,你将为你的页面添加一个XSS可用性。相反,您应该在注入目标语言时对用户输入进行编码,并转义将以目标语言计算的字符。在这种情况下,如果用户输入包含单引号字符(我假设原始示例中的字符串文字应该用单引号括起来,但如果你使用它们,双引号也是如此),任何跟随它的JavaScript代码都将被浏览器解释并执行。要安全地执行您要执行的操作,您应该将downloadfile.jsp中的行更改为:
selectedFile = '${fn:replace(param.fileName, "'", "\'")}';
这将只转义单引号,否则将结束字符串文字声明。
如果您使用双引号,那么这是合适的:
selectedFile = "${fn:replace(param.fileName, '"', '\"')}";
值得注意的是,当字符串文字最终被转储到HTML标记中时,escapeXml可能适合转义JavaScript字符串文字(通常也是如此)。但是,在这种情况下,值不应该是XML转义,因为它是在文件路径的上下文中计算的,而不是在HTML的上下文中。