由于在jsp文件中使用双引号而导致的简单错误

时间:2011-06-28 03:34:25

标签: jsp escaping double-quotes

我的Web应用程序中的JSP文件中有以下代码行,它出错:

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

我得到的错误信息是:

  

org.apache.jasper.JasperException:   /loginbean.jsp(6,59)属性值   request.getParameter(“userName”)是   引用“必须逃脱   在值

中使用时

我在某些网站上看到的是'(单引号)或"(双引号)等字符需要以转义序列\为前缀(反斜杠)将被使用。

但是,当我尝试使用反斜杠为双引号(在单词userName附近)添加前缀时,我立即得到以下错误 - “非法字符\ 92-未封闭的字符串文字”

如何解决此问题?

7 个答案:

答案 0 :(得分:47)

您应该在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/

答案 1 :(得分:6)

如果您不想修改JSP,只需设置:

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

{TOMCAT_ROOT}/conf/catalina.properties文件中。像魅力一样工作!

荣誉from here

答案 2 :(得分:6)

如果您使用的是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>

答案 3 :(得分:4)

这可以通过IDE Regexp替换来修复:

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

要替换文字,请输入:

$ 1 '$ 2'

答案 4 :(得分:1)

该示例看起来像一个XSS示例!这是一个安全漏洞。 我建议安装一个html编码库,比如c:out tag或http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html#encodeForHTMLAttribute%28java.lang.String%29

我还建议从经过身份验证的会话中获取userName,如果可能,不要形成请求参数(除非这只是登录/注册表单!)

答案 5 :(得分:0)

如果你使用“as scriplet delimeter,你不能在getParameter中使用some作为属性定界符。所以用'更改scriptlet的分隔符。'作为标记参数,我认为没有问题。否则替换:

值= “LT;%=用request.getParameter(” userName的 “)%&gt;” 中/&GT;

by:

值= '&LT;%=用request.getParameter( “userName的”)%&GT;'/&GT;

答案 6 :(得分:0)

我的情况是在项目构建期间使用Jasper JSP验证阶段。

从Tomcat 8开始,Ant任务有一个新属性strictQuoteEscaping,从命令行运行-no-strictQuoteEscaping开关org.apache.jasper.JspC