Parámetros de tipo String
INTEGRIDAD
Se aplican directrices a parámetros RequestParam, PathVariable y RequestBody de tipo String.
Este requisito corrige las vulnerabilidades
Command Injection
Cross-Site Scripting (XSS)
Unvalidated Redirects and Forwards
Insufficient Attack Protection
Underprotected APIs
Descripción
Longitud:
Los parámetros de tipo String deben tener acotada su longitud máxima mediante la anotación @Size(max = valorMax).
Opcionalmente, pueden además tener acotada su longitud mínima mediante @Size(min = valorMin, max = valorMax).
Patrón:
Los parámetros de tipo String deben tener definido un patrón, mediante una de las siguientes anotaciones:−@Email Para definir que el patrón del parámetro es un correo electrónico.−@NIF Para definir que el patrón del parámetro es un Número de Identificación Fiscal.−@Telefono Para definir que el patrón del parámetro es un número de teléfono.−@Ean13 Para definir que el patrón del parámetro es "European Article Number".−@Iban Para definir que el patrón del parámetro es un "International Bank Account Number".−@Pattern(regexp = "pattern") Para definir el patrón del parámetro mediante una expresión regular personalizada.
Ejemplo incorrecto
/**
* Ejemplos de parámetros de tipo String con longitud acotada incorrectos.
*
* @param stringParam
* Parámetro de tipo String. Le falta la anotación @Size(max = valorMax) indicando su longitud maxima.
* @param stringParamMinSize
* Parámetro de tipo String con longitud mínima. Le falta el atributo max de la anotación @Size indicando
* su longitud maxima.
* @return Response entity con los valores de los parámetros de entrada.
*/
@RequestMapping(value = "/string-size-limits", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> stringSizeLimits(
@RequestParam(name = "string-param", required = false, defaultValue = "a") String stringParam,
@RequestParam(name = "string-param-min-size", required = false, defaultValue = "aaa") @Size(min = 3) String stringParamMinSize) {
...
}
/**
* Ejemplos de parámetros de tipo String con patrón incorrectos.
*
* @param stringParam
* Parámetro de tipo String. Le falta una de las siguientes anotaciones indicando su
* patrón: @Email, @NIF, @Telefono, @Ean13, @Iban, @Pattern(regexp = "pattern")
* o @SuppressValidation(PATTERN).
* @return Response entity con los valores de los parámetros de entrada.
*/
@RequestMapping(value = "/string-patterns", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> stringPatterns(
@RequestParam(name = "string-param", required = false) String stringParam) {
...
}
Ejemplo correcto
**
* Ejemplos de parámetros de tipo String con longitud acotada.
*
* @param stringParam
* Parámetro de tipo String.
* @param stringParamMinSize
* Parámetro de tipo String con longitud mínima.
* @return Response entity con los valores de los parámetros de entrada.
*/
RequestMapping(value = "/string-size-limits", method = RequestMethod.GET)
ublic ResponseEntity<Map<String, Object>> stringSizeLimits(
@RequestParam(name = "string-param", required = false, defaultValue = "a") @Size(max = 5) String stringParam,
@RequestParam(name = "string-param-min-size", required = false, defaultValue = "aaa") @Size(min = 3, max = 5) String stringParamMinSize) {
...
}
mport static com.inditex.aqsw.framework.common.validation.annotation.SuppressValidationValues.PATTERN;
..
**
* Ejemplos de parámetros de tipo String con patrón.
*
* @param stringParamEmail
* Parámetro de tipo String con patrón Email.
* @param stringParamNif
* Parámetro de tipo String con patrón NIF.
* @param stringParamTelefono
* Parámetro de tipo String con patrón Teléfono.
* @param stringParamEan13
* Parámetro de tipo String con patrón EAN13.
* @param stringParamIban
* Parámetro de tipo String con patrón IBAN.
* @param stringParamPattern
* Parámetro de tipo String con patrón personalizado por expresión regular.
* @return Response entity con los valores de los parámetros de entrada.
*/
RequestMapping(value = "/string-patterns", method = RequestMethod.GET)
ublic ResponseEntity<Map<String, Object>> stringPatterns(
@RequestParam(name = "string-param-email", required = false) @Email String stringParamEmail,
@RequestParam(name = "string-param-nif", required = false) @NIF String stringParamNif,
@RequestParam(name = "string-param-telefono", required = false) @Telefono String stringParamTelefono,
@RequestParam(name = "string-param-ean13", required = false) @Ean13 String stringParamEan13,
@RequestParam(name = "string-param-iban", required = false) @Iban String stringParamIban,
@RequestParam(name = "string-param-pattern", required = false) @Pattern(regexp = "0x[0-9a-f]{3,5}") String stringParamPattern {
...
}
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