Insecure hostname validation check
Vérification non sécurisée de la validation du nom d'hôte
Description
L'application effectue une validation de nom d'hôte non sécurisée en utilisant des méthodes faciles à contourner comme startsWith ou endsWith. Un attaquant peut aisément contourner cette vérification en enregistrant un domaine qui correspond au motif de vérification.
Les vérifications composites utilisant à la fois startsWith et endsWith sont tout aussi non sécurisées, car l'attaquant peut toujours créer un domaine avec une entrée intermédiaire aléatoire correspondant au motif vérifié.
Recommandation
Pour garantir une validation sécurisée du nom d'hôte, envisagez les implémentations ci-dessous.
-
Implémenter la validation par expression régulière (Regex) : Au lieu d'utiliser des méthodes simples comme
startsWithouendsWith, optez pour des expressions régulières afin d'effectuer une validation exhaustive du nom d'hôte. Les motifs Regex permettent d'établir des critères de correspondance précis. -
Envisager des bibliothèques de validation standardisées : Utilisez des bibliothèques ou des frameworks établis offrant des fonctionnalités robustes de validation de nom d'hôte. Ces bibliothèques sont souvent bien maintenues et régulièrement mises à jour pour corriger d'éventuelles failles de sécurité.
-
Implémenter une liste blanche (Whitelisting) : Si vous avez un nombre limité d'hôtes sur liste blanche, envisagez d'implémenter une approche basée sur une liste blanche, où seuls les noms d'hôte connus et de confiance sont acceptés par l'application.
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");
}
}
Liens
Normes
- 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