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