Gestion sécurisée des entrées
Principes de gestion sécurisée des entrées
La gestion sécurisée des entrées est essentielle pour prévenir les vulnérabilités de sécurité et garantir les performances robustes des applications. Cette section explore les techniques pour traiter et gérer les entrées utilisateur de manière sécurisée.
Prévention des dépassements de tampon
Protection du tampon de la pile
#define MAX_INPUT 50
void safeInputHandler(char* buffer) {
char input[MAX_INPUT];
// Utiliser fgets pour une entrée plus sécurisée
if (fgets(input, sizeof(input), stdin) != NULL) {
// Supprimer le caractère de nouvelle ligne
input[strcspn(input, "\n")] = 0;
// Copie sécurisée avec limite de longueur
strncpy(buffer, input, MAX_INPUT - 1);
buffer[MAX_INPUT - 1] = '\0';
}
}
Stratégies de nettoyage des entrées
graph TD
A[Entrée brute] --> B{Nettoyage}
B --> C[Suppression des caractères spéciaux]
B --> D[Suppression des espaces]
B --> E[Validation de la longueur]
B --> F[Échappement des caractères dangereux]
F --> G[Entrée sécurisée]
Techniques de gestion de la mémoire
Allocation dynamique de mémoire
char* safeDynamicInput(int maxLength) {
char* buffer = malloc(maxLength * sizeof(char));
if (buffer == NULL) {
fprintf(stderr, "Échec de l'allocation mémoire\n");
return NULL;
}
// Gestion sécurisée des entrées
if (fgets(buffer, maxLength, stdin) == NULL) {
free(buffer);
return NULL;
}
// Suppression de la nouvelle ligne
buffer[strcspn(buffer, "\n")] = 0;
return buffer;
}
Techniques de validation des entrées
Technique |
Description |
Niveau de sécurité |
Vérification de longueur |
Limiter la taille de l'entrée |
Moyen |
Validation de type |
Assurer le type de données correct |
Élevé |
Filtrage de caractères |
Supprimer/échapper les caractères dangereux |
Élevé |
Nettoyage des entrées |
Nettoyer et normaliser l'entrée |
Très élevé |
Considérations de sécurité avancées
Protection contre le dépassement d'entier
int safeIntegerConversion(const char* input) {
char* endptr;
long value = strtol(input, &endptr, 10);
// Vérification des erreurs de conversion
if (endptr == input) {
fprintf(stderr, "Aucune conversion effectuée\n");
return -1;
}
// Vérification du dépassement d'entier
if ((value == LONG_MAX || value == LONG_MIN) && errno == ERANGE) {
fprintf(stderr, "Dépassement d'entier\n");
return -1;
}
return (int)value;
}
Flux de gestion des erreurs
graph TD
A[Entrée utilisateur] --> B{Validation}
B -->|Valide| C[Traitement de l'entrée]
B -->|Invalide| D[Enregistrement de l'erreur]
D --> E[Génération du message d'erreur]
D --> F[Réinitialisation de l'état de l'entrée]
Bonnes pratiques
- Valider et nettoyer toujours les entrées
- Utiliser des fonctions d'entrée sécurisées
- Implémenter des vérifications de limites strictes
- Gérer soigneusement l'allocation mémoire
- Fournir des retours d'erreur clairs
LabEx souligne que la gestion sécurisée des entrées est un aspect crucial du développement logiciel sécurisé, nécessitant une vigilance constante et une approche systématique.