Подтвердить что ты не робот

Простая ошибка из-за использования двойных кавычек в файле jsp

У меня есть следующая строка кода в 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- Незакрытый строковый литерал"

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

4b9b3361

Ответ 1

Вы должны использовать одинарные кавычки в параметре 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/

Ответ 2

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

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

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

Kudos отсюда.

Ответ 3

Это может быть исправлено с помощью IDE Regexp Replace:

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

Для текста замены введите:

$1 '$ 2'

Ответ 4

Если вы используете 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>

Ответ 5

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

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

Ответ 6

если вы используете "как разделитель сценариев", вы не можете использовать какой-либо элемент в качестве разделителя свойств в getParameter. Поэтому измените разделитель скриптлета на ". Как параметр тега, я думаю, что там не будет проблем. заменить:

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

:

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

Ответ 7

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

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