Insecure hostname validation check
Comprobación insegura en la validación del nombre de host
Descripción
La aplicación realiza una validación insegura del nombre de host utilizando métodos fáciles de eludir como startsWith o endsWith. Un atacante puede evitar fácilmente esta comprobación registrando un dominio que coincida con el patrón de verificación.
Las comprobaciones compuestas tanto con startsWith como con endsWith son igualmente inseguras, ya que el ataque aún puede crear un dominio con una entrada intermedia aleatoria que coincida con el patrón verificado.
Recomendación
Para garantizar una validación segura del nombre de host, considere las siguientes implementaciones.
-
Implementar validación mediante expresiones regulares (Regex): En lugar de utilizar métodos simples como
startsWithoendsWith, opte por expresiones regulares para realizar una validación exhaustiva del nombre de host. Los patrones Regex permiten establecer criterios de coincidencia precisos. -
Considerar bibliotecas de validación estandarizadas: Utilice bibliotecas o frameworks establecidos que ofrezcan funcionalidades robustas de validación de nombres de host. Estas bibliotecas suelen estar bien mantenidas y se actualizan periódicamente para solucionar posibles fallos de seguridad.
-
Implementar listas blancas (Whitelisting): Si tiene un número limitado de hosts permitidos, considere implementar un enfoque de lista blanca donde la aplicación solo acepte nombres de host conocidos y de confianza.
import java.util.regex.*;
public class SubdomainValidator {
public static void main(String[] args) {
String userInput = "sub.example.com"; // replace this with user input
// Regular expression pattern to match subdomains of example.com
String pattern = "^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\\.)+example\\.com$";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Create Matcher object
Matcher m = r.matcher(userInput);
// Check if input matches the pattern
if (m.find()) {
System.out.println("Valid subdomain of example.com");
} else {
System.out.println("Invalid subdomain of example.com");
}
}
}
import Foundation
func isValidSubdomain(_ userInput: String) -> Bool {
let pattern = #"^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+example\.com$"# // Regular expression pattern
let regex = try! NSRegularExpression(pattern: pattern)
let range = NSRange(location: 0, length: userInput.utf16.count)
return regex.firstMatch(in: userInput, options: [], range: range) != nil
}
let userInput = "sub.example.com" // replace this with user input
if isValidSubdomain(userInput) {
print("Valid subdomain of example.com")
} else {
print("Invalid subdomain of example.com")
}
import 'package:flutter/material.dart';
bool isValidSubdomain(String userInput) {
RegExp regex = RegExp(r'^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+example\.com$');
return regex.hasMatch(userInput);
}
void main() {
String userInput = "sub.example.com"; // replace this with user input
if (isValidSubdomain(userInput)) {
print("Valid subdomain of example.com");
} else {
print("Invalid subdomain of example.com");
}
}
Enlaces
Estándares
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- CWE_TOP_25:
- CWE_20
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213