我有一个Java / JSP Web应用程序,在将fn:escapeXml()
添加到构造URL的标记中后,它开始显示错误。
原始代码是
<p id="provide-link">
Follow this link to see the source data:
<q:link href="../resources/source-data.jsp"
sourceData="${chart.parameters.source}">
Source Data
</q:link>
</p>
q:link
是一个自定义标记,它创建了一个以href
为基础,以sourceData
作为GET参数的超链接。例如,如果chart.parameters.source = 'dataset03'
,则页面中嵌入的链接为../resources/source-data.jsp&sourceData=dataset03
。定制标签
q:link
用于处理chart.parameters.source
是多个数据源的集合的情况,这是允许的情况。该代码正常工作,但是由于GET参数而容易受到脚本插入攻击。因此,我在代码中添加了JSTL函数
escapeXml()
来防止这种情况: <p id="provide-link">
Follow this link to see the source data:
<q:link href="../resources/source-data.jsp"
sourceData="${fn:escapeXml(chart.parameters.source)}">
Source Data
</q:link>
</p>
当我这样做时,方括号会添加到URL:
../resources/source-data.jsp&sourceData=[dataset03]
这是一个问题,因为
[dataset03]
不是该参数的有效值。我在网上找到的唯一有关此问题的信息是this question,它没有提供完整的答案,但暗示
${fn:escapeXml(chart.parameters.source)}
可能已作为数组输出,因为它包含fn:escapeXml()
。从理论上讲,q:link
然后在转换为String时捕获并保留Array括号。有人知道发生了什么事以及如何阻止它吗?
最佳答案
您的最后一个建议对我来说似乎是正确的,fn:escapeXml函数的参数类型为String。如果传递的参数是Collection,它将通过toString()方法(添加[])进行转换。它会附加在fn:escapeXml()调用之前,因此不会添加到其中。
雷姆:它没有附加的escapeXml函数,因为您的自定义标记可直接检索并在Collection上工作(可能在其内部迭代其值)。
一种将作为参数传递的Collection转换为传递给escapeXml fct的解决方案;通过标签或EL表达式(map()...)
Rem2:已经有这些标准JSTL标记代替了使用自定义标记对url参数进行编码的工作:
https://www.tutorialspoint.com/jsp/jstl_core_param_tag.htm
https://www.tutorialspoint.com/jsp/jstl_core_url_tag.htm
希望能有所帮助,
亲切的问候,
塞德里克