Browse Source

Update processPath for double encoding

See gh-33689
pull/33720/head
rstoyanchev 1 year ago
parent
commit
fb7890d739
  1. 24
      spring-webflux/src/main/java/org/springframework/web/reactive/function/server/PathResourceLookupFunction.java
  2. 24
      spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java
  3. 24
      spring-webmvc/src/main/java/org/springframework/web/servlet/function/PathResourceLookupFunction.java
  4. 24
      spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java

24
spring-webflux/src/main/java/org/springframework/web/reactive/function/server/PathResourceLookupFunction.java

@ -148,20 +148,28 @@ class PathResourceLookupFunction implements Function<ServerRequest, Mono<Resourc @@ -148,20 +148,28 @@ class PathResourceLookupFunction implements Function<ServerRequest, Mono<Resourc
}
private static String normalizePath(String path) {
if (path.contains("%")) {
try {
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
String result = path;
if (result.contains("%")) {
result = decode(result);
if (result.contains("%")) {
result = decode(result);
}
catch (Exception ex) {
return "";
}
if (path.contains("../")) {
path = StringUtils.cleanPath(path);
if (result.contains("../")) {
return StringUtils.cleanPath(result);
}
}
return path;
}
private static String decode(String path) {
try {
return URLDecoder.decode(path, StandardCharsets.UTF_8);
}
catch (Exception ex) {
return "";
}
}
private boolean isInvalidPath(String path) {
if (path.contains("WEB-INF") || path.contains("META-INF")) {
return true;

24
spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java

@ -567,20 +567,28 @@ public class ResourceWebHandler implements WebHandler, InitializingBean { @@ -567,20 +567,28 @@ public class ResourceWebHandler implements WebHandler, InitializingBean {
}
private static String normalizePath(String path) {
if (path.contains("%")) {
try {
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
String result = path;
if (result.contains("%")) {
result = decode(result);
if (result.contains("%")) {
result = decode(result);
}
catch (Exception ex) {
return "";
}
if (path.contains("../")) {
path = StringUtils.cleanPath(path);
if (result.contains("../")) {
return StringUtils.cleanPath(result);
}
}
return path;
}
private static String decode(String path) {
try {
return URLDecoder.decode(path, StandardCharsets.UTF_8);
}
catch (Exception ex) {
return "";
}
}
/**
* Check whether the given path contains invalid escape sequences.
* @param path the path to validate

24
spring-webmvc/src/main/java/org/springframework/web/servlet/function/PathResourceLookupFunction.java

@ -149,20 +149,28 @@ class PathResourceLookupFunction implements Function<ServerRequest, Optional<Res @@ -149,20 +149,28 @@ class PathResourceLookupFunction implements Function<ServerRequest, Optional<Res
}
private static String normalizePath(String path) {
if (path.contains("%")) {
try {
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
String result = path;
if (result.contains("%")) {
result = decode(result);
if (result.contains("%")) {
result = decode(result);
}
catch (Exception ex) {
return "";
}
if (path.contains("../")) {
path = StringUtils.cleanPath(path);
if (result.contains("../")) {
return StringUtils.cleanPath(result);
}
}
return path;
}
private static String decode(String path) {
try {
return URLDecoder.decode(path, StandardCharsets.UTF_8);
}
catch (Exception ex) {
return "";
}
}
private boolean isInvalidPath(String path) {
if (path.contains("WEB-INF") || path.contains("META-INF")) {
return true;

24
spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java

@ -726,20 +726,28 @@ public class ResourceHttpRequestHandler extends WebContentGenerator @@ -726,20 +726,28 @@ public class ResourceHttpRequestHandler extends WebContentGenerator
}
private static String normalizePath(String path) {
if (path.contains("%")) {
try {
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
String result = path;
if (result.contains("%")) {
result = decode(result);
if (result.contains("%")) {
result = decode(result);
}
catch (Exception ex) {
return "";
}
if (path.contains("../")) {
path = StringUtils.cleanPath(path);
if (result.contains("../")) {
return StringUtils.cleanPath(result);
}
}
return path;
}
private static String decode(String path) {
try {
return URLDecoder.decode(path, StandardCharsets.UTF_8);
}
catch (Exception ex) {
return "";
}
}
/**
* Check whether the given path contains invalid escape sequences.
* @param path the path to validate

Loading…
Cancel
Save