【问题标题】:simple error due to use of double quotes in a jsp file由于在 jsp 文件中使用双引号导致的简单错误
【发布时间】:2011-06-28 03:34:24
【问题描述】:

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

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

我得到的错误信息是:

org.apache.jasper.JasperException: /loginbean.jsp(6,59) 属性值 request.getParameter("userName") 是 用 " 引用,必须转义 在值内使用时

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

但是,当我尝试在双引号(围绕单词 userName)前加上反斜杠时,我立即收到以下错误 - “Illegal Character \92- Unclosed String Literal”

我该如何解决这个问题?

【问题讨论】:

标签: jsp escaping double-quotes


【解决方案1】:

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

【讨论】:

  • 我尝试使用单引号 - 我现在收到以下错误 - org.apache.jasper.JasperException: org.apache.jasper.JasperException: Can't find a method to write property 'userName' “logbean.LoginBean”类型的 bean 中的“java.lang.String”类型
  • 还设置stackoverflow.com/questions/9878326/… 了解如何为 jasper ant 任务设置此项
【解决方案2】:

如果您使用的是 Tomcat 8.5+,则属性 org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false 不会被承认。

通过在&lt;servlet&gt; 块中添加以下内容,我能够在{TOMCAT_ROOT}/conf/web.xml 中成功设置属性:

<init-param>
    <param-name>strictQuoteEscaping</param-name>
    <param-value>false</param-value>
</init-param>

【讨论】:

  • 默认情况下,web.xml 中有两个servlet 元素。您需要将上述init-param 元素放在&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;
【解决方案3】:

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

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

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

感谢from here

【讨论】:

    【解决方案4】:

    这可以通过 IDE 正则表达式替换来修复:

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

    对于替换文本,输入:

    $1'$2'

    【讨论】:

    • +1 令人印象深刻。不可读或任何东西,但令人印象深刻。
    • 而不是用单引号替换,我想用转义内部双引号来替换。我的正则表达式和替换文本应该是什么。
    • 我获得了很多时间!这就是我要找的!
    • @thiru_k 有同样的问题,这里有一个正则表达式供将来参考 (?&lt;=&lt;%=.*)(?!\\)"(?=.*%&gt;) 替换为 \\"
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      value=""/>

      作者:

      value=''/>

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-01
          • 1970-01-01
          • 2022-08-06
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-15
          相关资源
          最近更新 更多