Почему fn: escape Xml () добавляет квадратные скобки в строку - PullRequest
0 голосов
/ 22 января 2020

У меня есть веб-приложение Java / JSP, которое начало показывать ошибку после того, как я добавил 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 затем перехватывает и сохраняет скобки массива при преобразовании в строку.

Кто-нибудь знает, что происходит и как это остановить?

1 Ответ

0 голосов
/ 26 января 2020

Ваше последнее предложение мне кажется правильным, функция fn: escape Xml имеет аргумент типа String. Если переданный параметр является коллекцией, он будет преобразован с помощью метода toString () (который добавляет []). Он добавляется перед вызовом fn: escape Xml (), поэтому он не добавляется внутри него.

Rem: он не добавляется без функции escape Xml, поскольку ваш пользовательский тег извлекается и работает с Непосредственно для коллекции (возможно, итерация по ее значениям внутри).

Одно решение для преобразования коллекции, переданной в качестве аргумента, перед передачей в escape Xml 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

Надеюсь, что это поможет, С уважением, Cedri c

...