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) |
---|
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