Получение неправильных символов в параметре - PullRequest
1 голос
/ 15 декабря 2009

В файлах .jsp я использую следующую привязку и комбинацию JSTL c: url -

<c:url value="downloadfile.jsp" var="dwnUrl" scope="request">
  <c:param name="fileType" value="PDF"/>
  <c:param name="fileId" value="${file.fileId}"/>
  <c:param name="fileName" value="${file.fileName}"/>
  </c:url>
<a href="${dwnUrl}">Download</a>

На downloadfile.jsp получение значения имени файла в переменной JavaScript как -

selectedFile = <c:out value='${param.fileName}'>

Теперь, если имя файла содержит какой-либо дополнительный символ, например, XYZ 2/3 "Технический , тогда на другой странице я получаю другой символ как - XYZ 2/3 # 034; Технический

Однако, если я печатаю request.getParameter ("fileName"), это дает правильное имя. Что не так?

Ответы [ 3 ]

1 голос
/ 04 февраля 2010

<c:out> по умолчанию экранирует сущности XML , такие как двойная кавычка. Это делается для того, чтобы получить правильно сформированный XML и избежать XSS .

Чтобы это исправить, вы должны либо избавиться от <c:out>, поскольку JSP 2.0, EL прекрасно работает и в тексте шаблона:

selectedFile = '${param.fileName}';

.. или, если вы все еще используете устаревшую JSP 1.2 или более раннюю версию, установите для атрибута escapeXml значение false:

selectedFile = '<c:out value="${param.fileName}" escapeXml="false">';

Обратите внимание, что я добавил одинарные кавычки и точку с запятой, чтобы сделать код JS действительным.

Излишне говорить, что вам нужно помнить о рисках XSS, если вы это сделаете.

0 голосов
/ 28 ноября 2012

Если вы просто включите escapeXml в false, как подсказывает @BalusC, вы добавите уязвимость XSS на свою страницу. Вместо этого вы должны кодировать пользовательский ввод во время внедрения в язык назначения и экранирующие символы, которые будут оцениваться на языке назначения. В этом случае, если пользовательский ввод содержал символ одинарной кавычки (я предполагаю, что строковый литерал в исходном примере должен был быть заключен в одинарные кавычки, но то же самое было бы верно для двойных кавычек, если вы их использовали), любой код JavaScript, который следует за ним, будет интерпретирован браузером и выполнен. Чтобы безопасно делать то, что вы пытаетесь сделать, вы должны изменить строку в downloadfile.jsp на:

selectedFile = '${fn:replace(param.fileName, "'", "\'")}';

Это будет экранировать только одинарные кавычки, которые в противном случае завершат объявление строкового литерала.

Если вы используете двойные кавычки, то это будет уместно:

selectedFile = "${fn:replace(param.fileName, '"', '\"')}";

Стоит отметить, что escapeXml может быть подходящим для экранирования строковых литералов JavaScript (и часто это так), когда строковый литерал в конечном итоге будет выгружен в разметку HTML. Однако в этом случае значение не должно быть экранированным XML, поскольку оно оценивается в контексте пути к файлу, а не в контексте HTML.

0 голосов
/ 15 декабря 2009

Прикольные символы в ваших <c:param> значениях URL-адресов кодируются <c:url>, как и должно быть. Что касается downloadfile.jsp, то контейнер сервлетов заботится о декодировании входящих переменных URL, поэтому вам не нужно это делать. Это нормальное поведение, и оно не должно создавать вам никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...