Простая ошибка из-за использования двойных кавычек в файле 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- Незакрытый строковый литерал"
Как решить эту проблему?
Ответы
Ответ 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 из командной строки.