This is an automated email from the ASF dual-hosted git repository. mthl pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
commit 889769593e1fedbf9bd9092550031c72e021d1cf Author: Samuel Trégouët <samuel.trego...@nereide.fr> AuthorDate: Mon Nov 4 22:42:02 2019 +0100 Improved: Remove ‘ServiceEventHandler#checkSecureParameter’ (OFBIZ-11260) There is no security reason justifying to prevent the invocation of service event handlers with URI parameters if we accept request body parameters. As a consequence it is preferable to unconditionally accept URI parameters and remove the ‘service.http.parameters.require.encrypted’ configuration property. --- build.gradle | 2 +- framework/webapp/config/url.properties | 4 -- .../ofbiz/webapp/event/ServiceEventHandler.java | 57 ---------------------- .../webapp/event/ServiceMultiEventHandler.java | 5 -- 4 files changed, 1 insertion(+), 67 deletions(-) diff --git a/build.gradle b/build.gradle index cfcceb1..3259468 100644 --- a/build.gradle +++ b/build.gradle @@ -307,7 +307,7 @@ checkstyle { // the sum of errors that were present before introducing the // ‘checkstyle’ tool present in the framework and in the official // plugins. - tasks.checkstyleMain.maxErrors = 37781 + tasks.checkstyleMain.maxErrors = 37780 // Currently there are a lot of errors so we need to temporarily // hide them to avoid polluting the terminal output. showViolations = false diff --git a/framework/webapp/config/url.properties b/framework/webapp/config/url.properties index 1b6923d..8daf72c 100644 --- a/framework/webapp/config/url.properties +++ b/framework/webapp/config/url.properties @@ -44,7 +44,3 @@ cookie.domain= # Exclude jsessionid for User-Agents (separated by comma's) link.remove_lsessionid.user_agent_list = googlebot,yahoo,msnbot,mediapartners-google - -# Should HTTP parameters sent to services require encryption? -# This is generally advised for more secure webapps as it makes it more difficult to spoof requests (XSRF) that change data. -service.http.parameters.require.encrypted=Y diff --git a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java index 0e28340..0b6040b 100644 --- a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java +++ b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceEventHandler.java @@ -23,7 +23,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.TimeZone; import javax.servlet.ServletContext; @@ -35,9 +34,7 @@ import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.UtilGenerics; import org.apache.ofbiz.base.util.UtilHttp; import org.apache.ofbiz.base.util.UtilValidate; -import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.GenericValue; -import org.apache.ofbiz.entity.util.EntityUtilProperties; import org.apache.ofbiz.service.DispatchContext; import org.apache.ofbiz.service.GenericServiceException; import org.apache.ofbiz.service.LocalDispatcher; @@ -47,7 +44,6 @@ import org.apache.ofbiz.service.ServiceAuthException; import org.apache.ofbiz.service.ServiceValidationException; import org.apache.ofbiz.webapp.control.ConfigXMLReader.Event; import org.apache.ofbiz.webapp.control.ConfigXMLReader.RequestMap; -import org.apache.ofbiz.webapp.control.ControlActivationEventListener; import org.apache.ofbiz.widget.renderer.VisualTheme; /** @@ -124,8 +120,6 @@ public class ServiceEventHandler implements EventHandler { Map<String, Object> rawParametersMap = UtilHttp.getCombinedMap(request); Map<String, Object> multiPartMap = UtilGenerics.cast(request.getAttribute("multiPartMap")); - Set<String> urlOnlyParameterNames = UtilHttp.getUrlOnlyParameterMap(request).keySet(); - // we have a service and the model; build the context Map<String, Object> serviceContext = new HashMap<>(); for (ModelParam modelParam: model.getInModelParamList()) { @@ -176,9 +170,6 @@ public class ServiceEventHandler implements EventHandler { // check the request parameters if (UtilValidate.isEmpty(value)) { - ServiceEventHandler.checkSecureParameter(requestMap, urlOnlyParameterNames, name, session, - serviceName, dctx.getDelegator()); - // if the service modelParam has allow-html="any" then get this direct from the // request instead of in the parameters Map so there will be no canonicalization // possibly messing things up @@ -321,52 +312,4 @@ public class ServiceEventHandler implements EventHandler { return responseString; } - public static void checkSecureParameter(RequestMap requestMap, Set<String> urlOnlyParameterNames, String name, - HttpSession session, String serviceName, Delegator delegator) throws EventHandlerException { - // special case for security: if this is a request-map defined as secure in - // controller.xml then only accept body parameters coming in, ie don't allow the - // insecure URL parameters - // NOTE: the RequestHandler will check the HttpSerletRequest security to make - // sure it is secure if the request-map -> security -> https=true, - // but we can't just look at the request.isSecure() method here because it is - // allowed to send secure requests for request-map with https=false - if (requestMap != null && requestMap.securityHttps) { - if (urlOnlyParameterNames.contains(name)) { - String errMsg = "Found URL parameter [" + name + "] passed to secure (https) request-map with uri [" - + requestMap.uri + "] with an event that calls service [" + serviceName - + "]; this is not allowed for security reasons! The data should be encrypted by making it " - + "part of the request body " + "(a form field) instead of the request URL." - + " Moreover it would be kind if you could create a Jira sub-task of " - + "https://issues.apache.org/jira/browse/OFBIZ-2330 " - + "(check before if a sub-task for this error does not exist)." - + " If you are not sure how to create a Jira issue please have a look before at " - + "https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Contributors+Best+Practices" - + " Thank you in advance for your help."; - Debug.logError("=============== " + errMsg + "; In session [" - + ControlActivationEventListener.showSessionId(session) - + "]; Note that this can be changed using the service.http.parameters.require.encrypted " - + "property in the url.properties file", - module); - - // the default here is true, so anything but N/n is true - boolean requireEncryptedServiceWebParameters = !EntityUtilProperties.propertyValueEqualsIgnoreCase( - "url", "service.http.parameters.require.encrypted", "N", delegator); - - // NOTE: this forces service call event parameters to be in the body and not in - // the URL! can be issues with existing links, like Delete links or whatever, - // and those need to be changed to forms! - if (requireEncryptedServiceWebParameters) { - throw new EventHandlerException(errMsg); - } - } - // NOTTODO: may want to allow parameters that map to entity PK fields to be in - // the URL, but that might be a big security hole since there are certain - // security sensitive entities that are made of only PK fields, or that only - // need PK fields to function (like UserLoginSecurityGroup) - // NOTTODO: we could allow URL parameters when it is not a POST (ie when - // !request.getMethod().equalsIgnoreCase("POST")), but that would open a - // security hole where sensitive parameters can be passed on the URL in a - // GET/etc and bypass this security constraint - } - } } diff --git a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceMultiEventHandler.java b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceMultiEventHandler.java index 8fb56f3..55c8929 100644 --- a/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceMultiEventHandler.java +++ b/framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/ServiceMultiEventHandler.java @@ -24,7 +24,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.TimeZone; import javax.servlet.ServletContext; @@ -169,8 +168,6 @@ public class ServiceMultiEventHandler implements EventHandler { throw new EventHandlerException(e); } - Set<String> urlOnlyParameterNames = UtilHttp.getUrlOnlyParameterMap(request).keySet(); - // big try/finally to make sure commit or rollback are run boolean beganTrans = false; String returnString = null; @@ -230,8 +227,6 @@ public class ServiceMultiEventHandler implements EventHandler { if (value == null) { String name = paramName + curSuffix; - ServiceEventHandler.checkSecureParameter(requestMap, urlOnlyParameterNames, name, session, serviceName, dctx.getDelegator()); - String[] paramArr = request.getParameterValues(name); if (paramArr != null) { if (paramArr.length > 1) {