我有一个Java/JSP网络应用程序,在我向构造URL的标签添加fn:escapeXml()
后,它已经开始显示错误。
原始代码是
<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
是一个自定义标记,用于创建 out outhref
超链接作为基础,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]
不是参数的有效值。
我在网上找到的关于这个问题的唯一一件事是这个问题,它没有提供完整的答案,但表明${fn:escapeXml(chart.parameters.source)}
现在可能包含fn:escapeXml()
数组。 理论上,q:link
在转换为字符串时会捕获并保留数组括号。
有人知道发生了什么以及如何阻止它吗?
你的最后一个建议对我来说似乎是正确的,fn:escapeXml 函数有一个字符串类型的参数。如果传递的参数是集合,它将通过 toString(( 方法(添加 [](进行转换。它附加在 fn:escapeXml(( 调用之前,因此不会添加到其中。
Rem:如果没有 escapeXml 函数,它不会追加,因为您的自定义标记直接检索并处理集合(可能在内部迭代其值(。
一种转换集合的解决方案,在将集合传递给 escapeXml fct 之前作为参数传递;通过标签或 EL 表达式 (map((...(
Rem2:不是使用自定义标签来编码你的url参数,已经有这些标准的JSTL标签可以做类似的工作: https://www.tutorialspoint.com/jsp/jstl_core_param_tag.htm https://www.tutorialspoint.com/jsp/jstl_core_url_tag.htm
希望这会有所帮助, 亲切问候 塞德里克