Anotación @PathVariable

Los parámetros anotados con @PathVariable son requeridos siempre, dado que si no se introducen, no se reconocerá la petición.
Aunque los parámetros PathVariable sean requeridos siempre, Spring no comprueba que no se introduzca en ellos un valor en blanco (por ejemplo, " ").

Este requisito corrige las vulnerabilidades

  • Command Injection

  • Cross-Site Scripting (XSS)

  • Unvalidated Redirects and Forwards

  • Insufficient Attack Protection

  • Underprotected APIs

 

Descripción

Por tanto, los parámetros PathVariable:

  • 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 PathVariable incorrectos. * * @param pathVariableString * Parámetro path variable de tipo String. Le falta la anotación @NotBlank. * @param pathVariableList * Parámetro path variable de tipo List. Le falta la anotación @NotEmpty. * @param pathVariableGeneric * Parámetro path variable de tipo genérico. Le falta la anotación @NotNull. * @return Response entity con los valores de los parámetros de entrada. */ @RequestMapping(value = "/path-variables/{path-variable-string}/{path-variable-list}/{path-variable-generic}/", method = RequestMethod.GET) public ResponseEntity<Map<String, Object>> pathVariables( @PathVariable(name = "path-variable-string") String pathVariableString, @PathVariable(name = "path-variable-list") List<?> pathVariableList, @PathVariable(name = "path-variable-generic") Long pathVariableGeneric) { ... }

Ejemplo correcto

/** * Ejemplos de parámetros PathVariable. * * @param pathVariableString * Parámetro PathVariable de tipo String. * @param pathVariableList * Parámetro PathVariable de tipo List. * @param pathVariableGeneric * Parámetro PathVariable de tipo genérico. * @param pathVariablePrimitive * Parámetro PathVariable de tipo primitivo. * @return Response entity con los valores de los parámetros de entrada. */ @RequestMapping(value = "/path-variables/{path-variable-string}/{path-variable-list}/{path-variable-generic}/", method = RequestMethod.GET) public ResponseEntity<Map<String, Object>> pathVariables( @PathVariable(name = "path-variable-string") @NotBlank String pathVariableString, @PathVariable(name = "path-variable-list") @NotEmpty List<?> pathVariableList, @PathVariable(name = "path-variable-generic") @NotNull Long pathVariableGeneric, @RequestParam(name = "path-variable-primitive") long pathVariablePrimitive) { ... }

 

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