Validação Segura de Valores
Princípios de Validação Segura de Valores
A validação segura de valores é uma abordagem crucial para garantir a integridade dos dados e prevenir potenciais vulnerabilidades de segurança em aplicações de software.
graph TD
A[Dados de Entrada] --> B{Processo de Validação}
B -->|Validação Aprovada| C[Processar Dados]
B -->|Validação Falha| D[Rejeitar/Lidar com o Erro]
Estratégias de Validação Abrangentes
1. Validação de Tipos de Dados
template <typename T>
bool validateNumericRange(T value, T min, T max) {
return (value >= min && value <= max);
}
// Exemplo de utilização
bool isValidAge(int age) {
return validateNumericRange(age, 0, 120);
}
2. Técnicas de Sanitização de Entrada
class InputValidator {
public:
static std::string sanitizeString(const std::string& input) {
std::string sanitized = input;
// Remover caracteres potencialmente perigosos
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) {
// Validação básica de email
std::regex email_regex(R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)");
return std::regex_match(email, email_regex);
}
};
Padrões de Validação
| Tipo de Validação |
Descrição |
Exemplo |
| Verificação de Intervalo |
Garantir que os valores estão dentro dos limites aceitáveis |
Idade entre 0-120 |
| Validação de Formato |
Verificar se a entrada corresponde ao padrão esperado |
Email, Número de Telefone |
| Validação de Tipo |
Confirmar o tipo de dados correto |
Inteiro, Cadeia de caracteres |
| Sanitização |
Remover entradas potencialmente prejudiciais |
Remover caracteres especiais |
Técnicas de Validação Avançadas
Classe de Validador Personalizada
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) {
// Registar erro de validação
std::cerr << "Validação falhou: " << e.what() << std::endl;
return false;
}
}
// Exemplo de utilização
static bool validateComplexInput(int value) {
return validate(value, [](int v) {
if (v < 0) throw std::invalid_argument("Valor negativo");
if (v > 1000) throw std::out_of_range("Valor demasiado grande");
return true;
});
}
};
Estratégias de Tratamento de Erros
graph TD
A[Processo de Validação] --> B{Resultado da Validação}
B -->|Válido| C[Processar Dados]
B -->|Inválido| D{Tratamento de Erros}
D --> E[Registar Erro]
D --> F[Devolver Mensagem de Erro]
D --> G[Lançar Exceção]
Boas Práticas
- Implementar múltiplas camadas de validação
- Utilizar métodos de validação seguros de tipo
- Sanitizar todas as entradas externas
- Implementar um tratamento de erros abrangente
- Registar falhas de validação
Recomendação do LabEx
No LabEx, enfatizamos a importância da validação robusta de entrada como um componente crítico do desenvolvimento de software seguro. Sempre assuma que a entrada é potencialmente maliciosa e valide-a em conformidade.
Exemplo Prático de Validação
class UserInputValidator {
public:
static bool validateUserRegistration(const std::string& username,
const std::string& email,
int age) {
// Validação abrangente
return (
!username.empty() &&
username.length() >= 3 &&
username.length() <= 50 &&
InputValidator::isValidEmail(email) &&
validateNumericRange(age, 13, 120)
);
}
};