我的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-未封闭的字符串文字”
如何解决此问题?
答案 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。