当浏览器打开带有参数的 URL 时,它会挂起并且 Java 应用程序(使用 UrlRewrite)抛出 RequestRejectedException:URL 包含“;”

问题描述 投票:0回答:1

有一个 Java、Spring、Tomcat Web 应用程序。 其中一部分负责使用生成的activationUrl(由唯一令牌组成)向新创建的用户发送激活电子邮件。该电子邮件是根据 Freemarker 模板创建的,在将电子邮件发送给用户之前,activationUrl 会被替换。 用户在浏览器中打开激活 URL 后,它应该加载(重定向到)需要提供密码等的用户激活页面。

问题是,浏览器因“正在处理...”而挂起,并且前端没有任何反应。 在后端我们可以看到这个堆栈跟踪:

13-Dec-2023 15:48:17.595 SEVERE [http-nio-8080-exec-9] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [default] in context with path [/ui] threw exception
    org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String ";"
        at org.springframework.security.web.firewall.StrictHttpFirewall.rejectedBlacklistedUrls(StrictHttpFirewall.java:288)
        at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:267)
        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:193)
        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
        at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
        at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
        at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
        at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:178)

生成并通过电子邮件接收的激活Url如下所示:

http://localhost:8080/ui/activate-account?tokenId=3&token=1462
(它已经被简化了,但关键是,它有两个由 ('&') 和符号分隔的 url 参数,它被“翻译”成
'&'
,其中包含潜在的恶意字符串“;”。

我们使用tuckey.org UrlRewrite 4.0.3

我们确实为此指定了一条规则:

<rule>
    <name>RULE: redirect security urls to index</name>
    <from>/(forgot-password|forgot-username|activate-account|reset-password|signout|locked-account|sso-error|ird-access-token)([\?\&amp;\=a-z0-9-]*)</from>
    <to last="true">/security/index.zul?function=$1</to>
</rule>

请注意,& 符号(url 参数分隔符)在规则中的表示方式

我的怀疑是,处理规则导致

?param1=xxxx&param2=yyyy
转换为
?param1=xxxx&amp;param2=yyyy
,从而导致抛出该异常。

从 urlrewrite 手册中,我无法找出可以应用于

to
元素的任何类型的属性。类似
escapeBackReference
(重写的 URL 中的反向引用是否应该转义)或
encodeUrl
属性将指定重写的 URL 是否应该进行编码。

知道如何解决吗?

仅供参考: 当浏览器中触发重新加载页面时,会重新加载页面并处理 URL,并显示正确的激活页面。通过将 URL 粘贴到任何浏览器(Edge、Chrome、FF)的私有/隐身窗口中,可以可靠地重现这一点。从正常浏览器会话甚至同一隐身模式重复尝试不会导致此问题,并且会按预期工作。然而,每个新用户在未连接到我们的服务器之前都会有一个全新的“新”浏览器,因此他们每个人都会体验它。

java spring urlencode html-escape-characters tuckey-urlrewrite-filter
1个回答
0
投票

适当的 URL 编码应将符号

&
转换为
%26
,而不是转换为
&amp;
- 这没有意义 - 如果符号
&
非法,则其替换不应包含符号
&
本身。您可以使用 Java 提供的类 UrlEncoder

进行 URL 编码
© www.soinside.com 2019 - 2024. All rights reserved.