繁体   English   中英

为什么 fn:escapeXml() 向 String 添加方括号

[英]Why is fn:escapeXml() adding square brackets to String

我有一个 Java/JSP webapp,在我将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]不是参数的有效值。

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

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

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

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

在将 Collection 作为参数传递给 escapeXml fct 之前转换它的一种解决方案; 通过标签或 EL 表达式 (map()...)

REM2:而不是使用自定义的标签进行编码您的网址参数,已经有这些标准JSTL标记,做类似的工作: https://www.tutorialspoint.com/jsp/jstl_core_param_tag.htm HTTPS://www.tutorialspoint。 com/jsp/jstl_core_url_tag.htm

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM