Safe Value Validation
Principles of Safe Value Validation
La validation sûre des valeurs est une approche essentielle pour garantir l'intégrité des données et prévenir les vulnérabilités de sécurité potentielles dans les applications logiciels.
graph TD
A[Input Data] --> B{Validation Process}
B -->|Pass Validation| C[Process Data]
B -->|Fail Validation| D[Reject/Handle Error]
Comprehensive Validation Strategies
1. Type-Safe Validation
template <typename T>
bool validateNumericRange(T value, T min, T max) {
return (value >= min && value <= max);
}
// Usage example
bool isValidAge(int age) {
return validateNumericRange(age, 0, 120);
}
class InputValidator {
public:
static std::string sanitizeString(const std::string& input) {
std::string sanitized = input;
// Remove potentially dangerous characters
sanitized.erase(
std::remove_if(sanitized.begin(), sanitized.end(),
[](char c) {
return !(std::isalnum(c) || c == ' ' || c == '-');
}),
sanitized.end()
);
return sanitized;
}
static bool isValidEmail(const std::string& email) {
// Basic email validation
std::regex email_regex(R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)");
return std::regex_match(email, email_regex);
}
};
Validation Patterns
Validation Type |
Description |
Example |
Range Checking |
S'assurer que les valeurs sont dans des limites acceptables |
Âge entre 0 et 120 ans |
Format Validation |
Vérifier que l'entrée correspond au modèle attendu |
Adresse e-mail, Numéro de téléphone |
Type Validation |
Confirmer le bon type de données |
Entier, Chaîne de caractères |
Sanitization |
Supprimer les entrées potentiellement dangereuses |
Supprimer les caractères spéciaux |
Advanced Validation Techniques
Custom Validator Class
class SafeValidator {
public:
template <typename T>
static bool validate(T value,
std::function<bool(T)> customCheck) {
try {
return customCheck(value);
} catch (const std::exception& e) {
// Log validation error
std::cerr << "Validation failed: " << e.what() << std::endl;
return false;
}
}
// Example usage
static bool validateComplexInput(int value) {
return validate(value, [](int v) {
if (v < 0) throw std::invalid_argument("Negative value");
if (v > 1000) throw std::out_of_range("Value too large");
return true;
});
}
};
Error Handling Strategies
graph TD
A[Validation Process] --> B{Validation Result}
B -->|Valid| C[Process Data]
B -->|Invalid| D{Error Handling}
D --> E[Log Error]
D --> F[Return Error Message]
D --> G[Throw Exception]
Best Practices
- Mettre en œuvre plusieurs couches de validation
- Utiliser des méthodes de validation sûres en termes de type
- Nettoyer toutes les entrées externes
- Mettre en œuvre une gestion d'erreurs complète
- Consigner les échecs de validation
LabEx Recommendation
Chez LabEx, nous soulignons l'importance d'une validation d'entrée robuste comme composant essentiel du développement de logiciels sécurisés. Toujours supposer que les entrées sont potentiellement malveillantes et valider en conséquence.
Practical Validation Example
class UserInputValidator {
public:
static bool validateUserRegistration(const std::string& username,
const std::string& email,
int age) {
// Comprehensive validation
return (
!username.empty() &&
username.length() >= 3 &&
username.length() <= 50 &&
InputValidator::isValidEmail(email) &&
validateNumericRange(age, 13, 120)
);
}
};