Anotación @RequestParam para parámetros obligatorios

INTEGRIDAD

Los parámetros anotados con @RequestParam por defecto son requeridos, a no ser que se indique lo contrario a través del atributo required = false de la anotación @RequestParam.

Este requisito corrige las vulnerabilidades

  • Command Injection

  • Cross-Site Scripting (XSS)

  • Unvalidated Redirects and Forwards

  • Insufficient Attack Protection

  • Underprotected APIs

 

Descripción

Spring comprueba que los parámetros RequestParam requeridos estén presentes en la petición, pero no comprueba que no se introduzca en ellos un valor en blanco (por ejemplo, " ").
Por tanto, los parámetros RequestParam requeridos:

  • Deben anotarse con @NotBlank si son de tipo String.

  • Deben anotarse con @NotEmtpy si son de tipo colección (por ejemplo, List).

  • Deben anotarse con @NotNull en el resto de casos, excepto si son de tipo primitivo.

  • Los parámetros de tipo primitivo (byte, short, int, long, float, double, boolean, char) no pueden ser null en ningún caso, por lo que no es necesario anotarlos.

 

Ejemplo incorrecto

/** * Ejemplos de parámetros RequestParam requeridos incorrectos. * * @param requiredRequestParamString * Parámetro RequestParam requerido de tipo String. Le falta la anotación @NotBlank. * @param requiredRequestParamList * Parámetro RequestParam requerido de tipo List. Le falta la anotación @NotEmtpy. * @param requiredRequestParamGeneric * Parámetro RequestParam requerido de tipo genérico. Le falta la anotación @NotNull. * @return Response entity con los valores de los parámetros de entrada. */ @RequestMapping(value = "/required-request-params", method = RequestMethod.GET) public ResponseEntity<Map<String, Object>> requiredRequestParams( @RequestParam(name = "required-request-param-string") String requiredRequestParamString, @RequestParam(name = "required-request-param-list") List<?> requiredRequestParamList, @RequestParam(name = "required-request-param-generic") Long requiredRequestParamGeneric) { ... }

Ejemplo correcto

/** * Ejemplos de parámetros RequestParam requeridos. * * @param requiredRequestParamString * Parámetro RequestParam requerido de tipo String. * @param requiredRequestParamList * Parámetro RequestParam requerido de tipo List. * @param requiredRequestParamGeneric * Parámetro RequestParam requerido de tipo genérico. * @param requiredRequestParamPrimitive * Parámetro RequestParam requerido de tipo primitivo. * @return Response entity con los valores de los parámetros de entrada. */ @RequestMapping(value = "/required-request-params", method = RequestMethod.GET) public ResponseEntity<Map<String, Object>> requiredRequestParams( @RequestParam(name = "required-request-param-string") @NotBlank String requiredRequestParamString, @RequestParam(name = "required-request-param-list") @NotEmpty List<?> requiredRequestParamList, @RequestParam(name = "required-request-param-generic") @NotNull Long requiredRequestParamGeneric, @RequestParam(name = "required-request-param-primitive") long requiredRequestParamPrimitive) { ... }

Cumplimiento de estándares y normativas

OWASP

OWASP [Top10/2016] A1 - Injection (in part)
OWASP [Top10/2016] A3 - Cross Site Scripting (XSS) (in part)
OWASP [Top10/2016] A10 - Unvalidated Redirects and Forwards
OWASP [Top10/2017] A7 - Insufficient Attack Protection
OWASP [Top10/2017] A10 - Underprotected APIs

Referencias

OWASP Top 10 Proactive Controls 2016:
https://www.owasp.org/index.php/OWASP_Proactive_Controls#tab=OWASP_Proactive_Controls_2016

OWASP Top 10 Proactive Controls 2016 Mapping:
https://www.owasp.org/index.php/OWASP_Proactive_Controls#tab=Top_10_Mapping_2016

OWASP Top 10 2017:
https://www.owasp.org/index.php/Top_10_2017-Top_10