Using the setAllowedFields() method in Spring

databinder, propertyeditor, spring, spring-3, spring-mvc

Solution

Instead of using `setAllowedFields()` to white-list, you can use `setDisallowedFields()` to black-list. For example, from the petclinic sample application:

@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
    dataBinder.setDisallowedFields("id");
}

From a pure security standpoint white-listing is preferred to black-listing, but it maybe help ease the burden some.

Problem

I'm using Spring 3.2.0. I have registered a few custom property editors for some basic needs as follows. ``` import editors.DateTimeEditor; import editors.StrictNumberFormatEditor; import java.math.RoundingMode; import java.net.URL; import java.text.DecimalFormat; import java.text.NumberFormat; import org.joda.time.DateTime; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.beans.propertyeditors.URLEditor; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.context.request.WebRequest; @ControllerAdvice public final class GlobalDataBinder { @InitBinder public void initBinder(WebDataBinder binder, WebRequest request) { binder.setIgnoreInvalidFields(true); binder.setIgnoreUnknownFields(true); //binder.setAllowedFields(someArray); NumberFormat numberFormat=DecimalFormat.getInstance(); numberFormat.setGroupingUsed(false); numberFormat.setMaximumFractionDigits(2); numberFormat.setRoundingMode(RoundingMode.HALF_UP); binder.registerCustomEditor(DateTime.class, new DateTimeEditor("MM/dd/yyyy HH:mm:ss", true)); binder.registerCustomEditor(Double.class, new StrictNumberFormatEditor(Double.class, numberFormat, true)); binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); binder.registerCustomEditor(URL.class, new URLEditor()); } } ``` I have this many editors registered so far. Two of them `DateTimeEditor` and `StrictNumberFormatEditor` have been customized by overriding respective methods to fulfill custom needs of number format and Joda-Time. Since I'm using Spring 3.2.0, I can take advantage of `@ControllerAdvice`. Spring recommends to list a set of allowed fields with the `setAllowedFields()` method so that malicious users can not inject values into bound objects. From the docs about `DataBinder` Binder that allows for setting property values onto a target object, including support for validation and binding result analysis. The binding process can be customized through specifying allowed fields, required fields, custom editors, etc. Note that there are potential security implications in failing to set an array of allowed fields. In the case of HTTP form POST data for example, malicious clients can attempt to subvert an application by supplying values for fields or properties that do not exist on the form. In some cases this could lead to illegal data being set on command objects or their nested objects. For this reason, it is highly recommended to specify the `allowedFields` property on the DataBinder. I have a big application and obviously there are thousands of fields. Specifying and listing all of them with the `setAllowedFields()` is a tedious job. Additionally, somehow I need to remember them. Changing a web page to remove some fields or add additional fields as the need arises again requires to modify the parameter value of the `setAllowedFields()` method to reflect those changes. Is there any alternative to this?

Original source