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