【发布时间】:2020-05-09 02:13:27
【问题描述】:
在我将fn:escapeXml() 添加到构造 URL 的标记后,我有一个 Java/JSP Web 应用程序开始显示错误。
原来的代码是
<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 在转换为字符串时会捕获并保留数组括号。
有人知道发生了什么以及如何阻止它吗?
【问题讨论】: