【问题标题】:Why is fn:escapeXml() adding square brackets to String为什么 fn:escapeXml() 向字符串添加方括号
【发布时间】: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&amp;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&amp;sourceData=[dataset03]

这是一个问题,因为[dataset03] 不是参数的有效值。

我在网上找到的关于这个问题的唯一信息是this question,它没有提供完整的答案,但表明${fn:escapeXml(chart.parameters.source)} 可能会作为数组输出,因为它包含fn:escapeXml()。理论上,q:link 在转换为字符串时会捕获并保留数组括号。

有人知道发生了什么以及如何阻止它吗?

【问题讨论】:

    标签: java jsp jsp-tags


    【解决方案1】:

    你的最后一个建议对我来说似乎是正确的,fn:escapeXml 函数有一个字符串类型的参数。如果传递的参数是一个Collection,它将通过一个toString() 方法(即添加[])进行转换。它附加在 fn:escapeXml() 调用之前,因此不会添加到其中。

    Rem:如果没有 escapeXml 函数,它不会追加,因为您的自定义标签会直接检索和处理 Collection(可能会迭代其内部的值)。

    在将 Collection 作为参数传递给 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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2013-10-08
      • 1970-01-01
      • 2021-08-22
      • 2011-09-30
      • 2011-10-10
      • 2021-06-09
      相关资源
      最近更新 更多