Springboot 不允许通过 URL 中的百分比和反斜杠

Gre*_*ill 4 rest special-characters spring-boot

我们收到了一个在 url 中发送字符串字符的 get 请求,因此我们使用路径变量来接收它们。显然,调用服务无法更改其调用后端的方法,因此我们需要能够接受具有以下未编码字符的 url:

当发送百分号 % 时,会返回一个 http 400。如果 % 后面的两个字符组成一个 UTF 编码的字符,它就会通过

反斜杠转换为正斜杠。我需要它来保持反斜杠。

我猜这些可能是 Tomcat 或 servlet 配置问题。

(弹簧启动版本 1.5.14.RELEASE)

g00*_*00b 7

如果您正确地对百分比符号 (%) 进行 URL 编码 ( %25) ,那么它们应该没有问题。但是,斜线和反斜线不适用于 Tomcat,即使您对它们(%2F%5C)进行了编码。

您可以在运行应用程序时设置以下属性:

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
Run Code Online (Sandbox Code Playgroud)

但是,这不会解决问题,因为在这种情况下,那些编码的斜杠将被识别为真实的斜杠。因此,假设您有以下控制器:

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
Run Code Online (Sandbox Code Playgroud)

那么,如果你调用/api/test%5Ctest,它将无法找到正确的路径。此问题的解决方案是使用通配符匹配器并从传入的 URL 本身解析HttpServletRequest

@RequestMapping("/api/**")
public String getFoo(HttpServletRequest request) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用完全不同的 Web 容器。例如,当使用 Jetty 时,这根本不是问题,URL 编码的斜杠和反斜杠都可以工作。


Blu*_*eft 6

Spring 5 现在默认阻止编码的百分号。要启用它们,请创建一个调用setAllowUrlEncodedPercent()的新 Bean

@Bean
public HttpFirewall allowEncodedParamsFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowUrlEncodedPercent(true);    
    return firewall;
}
Run Code Online (Sandbox Code Playgroud)

对于向前向后斜杠有类似的方法调用