[java-shib-shared] branch main updated: Add allowed params support to BasicHttpServletRequestParametersValidator
Brent Putman
putmanb at georgetown.edu
Sat Mar 22 23:09:49 UTC 2025
This is an automated email from the git hooks/post-receive script.
putmanb pushed a commit to branch main
in repository java-shib-shared.
View the commit online:
http://git.shibboleth.net/view/?p=java-shib-shared.git;a=commit;h=f2b6de9078086e12cdd60728ae040d15579894d6
The following commit(s) were added to refs/heads/main by this push:
new f2b6de90 Add allowed params support to BasicHttpServletRequestParametersValidator
f2b6de90 is described below
commit f2b6de9078086e12cdd60728ae040d15579894d6
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Sat Mar 22 18:57:41 2025 -0400
Add allowed params support to BasicHttpServletRequestParametersValidator
---
...BasicHttpServletRequestParametersValidator.java | 65 ++++++++++++++++++++++
...cHttpServletRequestParametersValidatorTest.java | 56 +++++++++++++++++++
2 files changed, 121 insertions(+)
diff --git a/shib-networking/src/main/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidator.java b/shib-networking/src/main/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidator.java
index 80b0faa0..cbbc506b 100644
--- a/shib-networking/src/main/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidator.java
+++ b/shib-networking/src/main/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidator.java
@@ -42,6 +42,12 @@ public class BasicHttpServletRequestParametersValidator extends AbstractInitiali
/** Logger. */
@Nonnull private Logger log = LoggerFactory.getLogger(BasicHttpServletRequestParametersValidator.class);
+ /** Flag indicating whether to enforce the allowed parameters. */
+ private boolean enforceAllowedParameters = false;
+
+ /** Allowed parameters. */
+ @Nonnull private Set<String> allowedParameters = CollectionSupport.emptySet();
+
/** Required parameters. */
@Nonnull private Set<String> requiredParameters = CollectionSupport.emptySet();
@@ -51,6 +57,53 @@ public class BasicHttpServletRequestParametersValidator extends AbstractInitiali
/** Mutually exclusive parameters. */
@Nonnull private Set<Set<String>> mutuallyExclusiveParameters = CollectionSupport.emptySet();
+ /**
+ * Get flag indicating whether to enforce the allowed parameters.
+ *
+ * <p>Defaults to <code>false</code>.
+ *
+ * @return flag indicating enforcement of allowed parameters
+ */
+ public boolean isEnforceAllowedParameters() {
+ return enforceAllowedParameters;
+ }
+
+ /**
+ * Set flag indicating whether to enforce the allowed parameters.
+ *
+ * <p>Defaults to <code>false</code>.
+ *
+ * @param flag indicating enforcement of allowed parameters
+ */
+ public void setEnforceAllowedParameters(final boolean flag) {
+ checkSetterPreconditions();
+ enforceAllowedParameters = flag;
+ }
+
+
+ /**
+ * Get the allowed parameters.
+ *
+ * <p>When enforced, a request parameter not in the allowed set will be considered invalid.</p>
+ *
+ * @return the allowed parameters
+ */
+ @Nonnull @Unmodifiable @NotLive public Set<String> getAllowedParameters() {
+ return allowedParameters;
+ }
+
+ /**
+ * Set the allowed parameters.
+ *
+ * <p>When enforced, a request parameter not in the allowed set will be considered invalid.</p>
+ *
+ * @param params the allowed parameters
+ */
+ public void setAllowedParameters(@Nullable final Set<String> params) {
+ checkSetterPreconditions();
+ allowedParameters = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(params));
+ }
+
/**
* Get the required parameters.
*
@@ -133,6 +186,18 @@ public class BasicHttpServletRequestParametersValidator extends AbstractInitiali
public void validate(@Nonnull final HttpServletRequest request) throws ServletException {
Constraint.isNotNull(request, "HttpServletRequest was null");
final Set<String> requestParams = request.getParameterMap().keySet();
+
+ if (isEnforceAllowedParameters()) {
+ log.debug("Evaluating request for allowed parameters: {}", getAllowedParameters());
+ for (final String requestParam : requestParams) {
+ if (!getAllowedParameters().contains(requestParam)) {
+ log.warn("HTTP request contained a disallowed parameter: {}", requestParam);
+ throw new ServletException("HTTP request contained a disallowed parameter: " + requestParam);
+ }
+ }
+ } else {
+ log.debug("Enforcement of allowed parameters is disabled");
+ }
log.debug("Evaluating request for required parameters: {}", getRequiredParameters());
for (final String param : getRequiredParameters()) {
diff --git a/shib-networking/src/test/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidatorTest.java b/shib-networking/src/test/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidatorTest.java
index 3ce4b909..9f1613ea 100644
--- a/shib-networking/src/test/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidatorTest.java
+++ b/shib-networking/src/test/java/net/shibboleth/shared/servlet/impl/BasicHttpServletRequestParametersValidatorTest.java
@@ -30,6 +30,26 @@ import net.shibboleth.shared.collection.Pair;
*/
public class BasicHttpServletRequestParametersValidatorTest {
+ @DataProvider
+ Object[][] allowedParamsSetterData() {
+ return new Object[][] {
+ new Object[] { Set.of(),
+ Set.of()},
+ new Object[] { Set.of(" Foo ", " Bar ", " "),
+ Set.of("Foo", "Bar")},
+ };
+ }
+
+ @Test(dataProvider="allowedParamsSetterData")
+ public void allowedSetter(Set<String> params, Set<String> expected) throws Exception {
+ BasicHttpServletRequestParametersValidator validator = new BasicHttpServletRequestParametersValidator();
+ validator.setAllowedParameters(params);
+ validator.initialize();
+
+ Assert.assertEquals(validator.getAllowedParameters(), expected);
+ }
+
+
@DataProvider
Object[][] requiredParamsSetterData() {
return new Object[][] {
@@ -89,6 +109,42 @@ public class BasicHttpServletRequestParametersValidatorTest {
Assert.assertEquals(validator.getMutuallyExclusiveParameters(), expected);
}
+ @DataProvider
+ Object[][] allowedParamsEvalData() {
+ return new Object[][] {
+ new Object[] { List.of(),
+ Set.of(),
+ true},
+ new Object[] { List.of(),
+ Set.of("Foo"),
+ true},
+ new Object[] { List.of(new Pair<>("Foo", new String[]{"abc"}), new Pair<>("Bar", new String[]{"def"})),
+ Set.of(),
+ false},
+ new Object[] { List.of(new Pair<>("Foo", new String[]{"abc"}), new Pair<>("Bar", new String[]{"def"})),
+ Set.of("Foo"),
+ false},
+ new Object[] { List.of(new Pair<>("Bar", new String[]{"def"}), new Pair<>("Bar", new String[]{"def"})),
+ Set.of("Foo", "Bar"),
+ true},
+ };
+ }
+
+ @Test(dataProvider="allowedParamsEvalData")
+ public void allowedEval(List<Pair<String, String[]>> requestParams, Set<String> allowedParams, boolean valid) throws Exception {
+ // First test enforce disabled, so all requests should eval to valid
+ BasicHttpServletRequestParametersValidator validator = new BasicHttpServletRequestParametersValidator();
+ validator.setEnforceAllowedParameters(false);
+ validator.setAllowedParameters(allowedParams);
+ evaluateRequest(validator, "allowed", requestParams, true);
+
+ // Now test enforce enabled, do result is as test data arg indicates
+ validator = new BasicHttpServletRequestParametersValidator();
+ validator.setEnforceAllowedParameters(true);
+ validator.setAllowedParameters(allowedParams);
+ evaluateRequest(validator, "allowed", requestParams, valid);
+ }
+
@DataProvider
Object[][] requiredParamsEvalData() {
return new Object[][] {
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list