простая ошибка из-за использования двойных кавычек в файле jsp - PullRequest
31 голосов
/ 28 июня 2011

У меня есть следующая строка кода в файле JSP в моем веб-приложении, которое выдает ошибку:

<jsp:setProperty name="db" property="userName" value="<%=request.getParameter("userName")%>"/>

Полученное сообщение об ошибке:

org.apache.jasper.JasperException: /loginbean.jsp(6,59) Значение атрибута request.getParameter ("userName") заключено в ", которое должно быть экранировано при использовании в пределах значения

ЧтоЯ читал на некоторых сайтах, что символы, такие как ' (одинарные кавычки) или " (двойные кавычки), должны начинаться с escape-последовательности \ (обратная косая черта), если они должны использоваться.

Однако, когда я пытаюсь поставить перед двойными кавычками (вокруг слова userName) обратную косую черту, я сразу же получаю следующую ошибку - «Недопустимый символ \ 92 - Unclosed String Literal»

Как мне решить эту проблему?

Ответы [ 7 ]

47 голосов
/ 28 июня 2011

Вы должны использовать одинарные кавычки в параметре value, например:

value='<%=request.getParameter("userName")%>'

или установить для параметра org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING значение false, как описано здесь:

http://blogs.sourceallies.com/2009/10/strict-quote-escaping-in-tomcat/

6 голосов
/ 20 сентября 2016

Если вы используете Tomcat 8.5+, свойство org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false не будет подтверждено.

Мне удалось успешно установить свойство в {TOMCAT_ROOT}/conf/web.xml, добавив в блок <servlet> следующее:

<init-param>
    <param-name>strictQuoteEscaping</param-name>
    <param-value>false</param-value>
</init-param>
6 голосов
/ 16 июля 2014

Если вы не хотите изменять JSP, просто установите:

org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false

в файле {TOMCAT_ROOT}/conf/catalina.properties.Работает как шарм!

Слава отсюда .

4 голосов
/ 07 декабря 2011

Это можно исправить с помощью IDE Regexp Заменить:

(<\w+:(?:[^>]|<%=[^%]+%>)+=)"([^<"]*<%=[^%]*"[^%]*%>[^"]*)"

В качестве текста замены введите:

$ 1 '$ 2'

1 голос
/ 17 июля 2014

Пример выглядит как пример XSS!Это уязвимость безопасности.Я предлагаю создать html-библиотеку кодирования, например тег c: out или http://owasp -esapi-java.googlecode.com / svn / trunk_doc / latest / org / owasp / esapi / Encoder.html # encodeForHTMLAttribute% 28java.lang.String% 29

Я также предлагаю вывести userName из аутентифицированного сеанса и не формировать параметр запроса, если это возможно (если только это не форма входа / регистрации!)

0 голосов
/ 17 мая 2017

В этом случае во время сборки проекта используется этап проверки Jasper JSP.

Начиная с Tomcat 8, появился новый атрибут strictQuoteEscaping для задачи Ant и переключатель -no-strictQuoteEscaping для запуска org.apache.jasper.JspC из командной строки.

0 голосов
/ 26 сентября 2013

если вы используете «в качестве разделителя скриптов, вы не можете использовать некоторые в качестве разделителя свойств в getParameter. заменить:

значение = "<% = request.getParameter (" имя_пользователя ")%>" />

по:

значение = '<% = request.getParameter ( "имя_пользователя")%>' />

...