Extract rejectNonPrintableAsciiCharactersInFieldName
Closes gh-11234
This commit is contained in:
parent
1f01203462
commit
0ece0e6012
|
@ -344,6 +344,11 @@ public class StrictHttpFirewall implements HttpFirewall {
|
||||||
if (!containsOnlyPrintableAsciiCharacters(requestUri)) {
|
if (!containsOnlyPrintableAsciiCharacters(requestUri)) {
|
||||||
throw new RequestRejectedException("The requestURI was rejected because it can only contain printable ASCII characters.");
|
throw new RequestRejectedException("The requestURI was rejected because it can only contain printable ASCII characters.");
|
||||||
}
|
}
|
||||||
|
rejectNonPrintableAsciiCharactersInFieldName(request.getRequestURI(), "requestURI");
|
||||||
|
rejectNonPrintableAsciiCharactersInFieldName(request.getServletPath(), "servletPath");
|
||||||
|
rejectNonPrintableAsciiCharactersInFieldName(request.getPathInfo(), "pathInfo");
|
||||||
|
rejectNonPrintableAsciiCharactersInFieldName(request.getContextPath(), "contextPath");
|
||||||
|
|
||||||
return new FirewalledRequest(request) {
|
return new FirewalledRequest(request) {
|
||||||
@Override
|
@Override
|
||||||
public void reset() {
|
public void reset() {
|
||||||
|
@ -351,6 +356,13 @@ public class StrictHttpFirewall implements HttpFirewall {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void rejectNonPrintableAsciiCharactersInFieldName(String toCheck, String propertyName) {
|
||||||
|
if (!containsOnlyPrintableAsciiCharacters(toCheck)) {
|
||||||
|
throw new RequestRejectedException(
|
||||||
|
String.format("The %s was rejected because it can only contain printable ASCII characters.", propertyName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void rejectForbiddenHttpMethod(HttpServletRequest request) {
|
private void rejectForbiddenHttpMethod(HttpServletRequest request) {
|
||||||
if (this.allowedHttpMethods == ALLOW_ANY_HTTP_METHOD) {
|
if (this.allowedHttpMethods == ALLOW_ANY_HTTP_METHOD) {
|
||||||
return;
|
return;
|
||||||
|
@ -434,6 +446,9 @@ public class StrictHttpFirewall implements HttpFirewall {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean containsOnlyPrintableAsciiCharacters(String uri) {
|
private static boolean containsOnlyPrintableAsciiCharacters(String uri) {
|
||||||
|
if (uri == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
int length = uri.length();
|
int length = uri.length();
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
char c = uri.charAt(i);
|
char c = uri.charAt(i);
|
||||||
|
|
|
@ -18,6 +18,7 @@ package org.springframework.security.web.firewall;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThatCode;
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||||
import static org.assertj.core.api.Assertions.fail;
|
import static org.assertj.core.api.Assertions.fail;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -379,6 +380,34 @@ public class StrictHttpFirewallTests {
|
||||||
|
|
||||||
// --- from DefaultHttpFirewallTests ---
|
// --- from DefaultHttpFirewallTests ---
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFirewalledRequestWhenContainsLineFeedThenException() {
|
||||||
|
this.request.setRequestURI("/something\n/");
|
||||||
|
assertThatExceptionOfType(RequestRejectedException.class)
|
||||||
|
.isThrownBy(() -> this.firewall.getFirewalledRequest(this.request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFirewalledRequestWhenServletPathContainsLineFeedThenException() {
|
||||||
|
this.request.setServletPath("/something\n/");
|
||||||
|
assertThatExceptionOfType(RequestRejectedException.class)
|
||||||
|
.isThrownBy(() -> this.firewall.getFirewalledRequest(this.request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFirewalledRequestWhenContainsCarriageReturnThenException() {
|
||||||
|
this.request.setRequestURI("/something\r/");
|
||||||
|
assertThatExceptionOfType(RequestRejectedException.class)
|
||||||
|
.isThrownBy(() -> this.firewall.getFirewalledRequest(this.request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getFirewalledRequestWhenServletPathContainsCarriageReturnThenException() {
|
||||||
|
this.request.setServletPath("/something\r/");
|
||||||
|
assertThatExceptionOfType(RequestRejectedException.class)
|
||||||
|
.isThrownBy(() -> this.firewall.getFirewalledRequest(this.request));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On WebSphere 8.5 a URL like /context-root/a/b;%2f1/c can bypass a rule on
|
* On WebSphere 8.5 a URL like /context-root/a/b;%2f1/c can bypass a rule on
|
||||||
* /a/b/c because the pathInfo is /a/b;/1/c which ends up being /a/b/1/c
|
* /a/b/c because the pathInfo is /a/b;/1/c which ends up being /a/b/1/c
|
||||||
|
|
Loading…
Reference in New Issue