простая ошибка из-за использования двойных кавычек в файле jsp
у меня есть следующая строка кода в файле JSP в моем веб-приложении, которая дает ошибку:
<jsp:setProperty name="db" property="userName" value="<%=request.getParameter("userName")%>"/>
сообщение об ошибке, которое я получаю:
org.апаш.Джаспер.JasperException: /loginbean.значение атрибута jsp(6,59) запрос.getParameter("имя") - это цитируется С " который должен быть спасен при использовании в пределах стоимости
что я читал на некоторых сайтах, что символы '
(одинарная кавычка) или "
(двойная кавычка) нужно чтобы иметь префикс escape-последовательности (косая черта), если они будут использованы.
однако, когда я пытаюсь префикс двойных кавычек (вокруг слова userName) с обратной косой чертой, я сразу получаю следующую ошибку- "незаконный символ 92 - незамкнутый строковый литерал"
как решить эту проблему?
7 ответов
вы должны использовать одинарные кавычки на value
параметр, то есть:
value='<%=request.getParameter("userName")%>'
и выберите до false
как описано здесь:
http://blogs.sourceallies.com/2009/10/strict-quote-escaping-in-tomcat/
Если вы не хотите изменять свой JSPs, просто установите:
org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
в своем . Работает как шарм!
респект отсюда.
если вы используете 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>
Это можно исправить с помощью IDE Regexp Replace:
(<\w+:(?:[^>]|<%=[^%]+%>)+=)"([^<"]*<%=[^%]*"[^%]*%>[^"]*)"
для текста замены введите:
$1'$2'
пример выглядит как пример XSS! Это уязвимость системы безопасности. Я предлагаю создать библиотеку кодирования html, такую как тег c:out илиhttp://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html#encodeForHTMLAttribute%28java.lang.String%29
Я также предлагаю взять имя пользователя из аутентифицированного сеанса и не формировать запрос param, если это возможно (если это не только форма входа/регистрации!)
Если вы используете " как делиметр скриплета, вы не можете использовать some как разделитель свойств в getParameter. Поэтому измените делиметр скриптлета на '.Поскольку это параметр тега, я думаю, что проблем не будет. В противном случае заменить :
value= " "/>
by:
value= ' '/>
I case Jasper фаза проверки JSP используется во время сборки проекта.
с Tomcat 8 появился новый атрибут strictQuoteEscaping для задачи Ant и переключатель -нет-strictQuoteEscaping для работы org.апаш.Джаспер.JspC из командной строки.