34

我的 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-未闭合的字符串文字”

我该如何解决这个问题?

4

7 回答 7

53

您应该在参数上使用单引号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/

于 2011-06-28T03:43:34.923 回答
12

如果您使用的是 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>
于 2016-09-20T18:37:07.693 回答
9

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

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

在你的{TOMCAT_ROOT}/conf/catalina.properties文件中。奇迹般有效!

来自这里的荣誉。

于 2014-07-16T17:14:35.170 回答
6

这可以通过 IDE 正则表达式替换来解决:

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

对于替换文本,输入:

$1'$2'

于 2011-12-07T13:57:39.240 回答
1

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

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

于 2014-07-17T08:51:03.117 回答
0

如果你使用“作为脚本分隔符,你不能使用一些作为getParameter中的属性分隔符。所以通过'更改scriptlet的分隔符。作为它的标签参数,我认为没有问题。否则替换:

value="<%=request.getParameter("userName")%>"/>

经过 :

value='<%=request.getParameter("userName")%>'/>

于 2013-09-26T10:08:59.663 回答
0

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

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

于 2017-05-16T21:44:24.080 回答