为什么 fn:escapeXml() 在字符串中添加方括号



我有一个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

希望这会有所帮助, 亲切问候 塞德里克

最新更新