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