Sichere Eingabe-Strategien
Überblick über die Sicherheit von Eingaben
Sichere Eingabe-Strategien sind entscheidend, um Sicherheitslücken zu vermeiden und eine robuste Programmleistung sicherzustellen. Diese Strategien helfen Entwicklern, Risiken im Zusammenhang mit Benutzereingaben und Systeminteraktionen zu mindern.
Eingabevalidierungs-Techniken
Typüberprüfung
int validate_integer_input(const char* input) {
char* endptr;
long value = strtol(input, &endptr, 10);
// Überprüfen Sie auf Konvertierungsfehler
if (endptr == input || *endptr != '\0') {
return 0; // Ungültige Eingabe
}
// Überprüfen Sie den Wertebereich
if (value < INT_MIN || value > INT_MAX) {
return 0; // Außerhalb des Integer-Bereichs
}
return 1; // Gültige Eingabe
}
Bereichsvalidierung
graph TD
A[Eingabe empfangen] --> B{Ist Eingabe gültig?}
B -->|Typüberprüfung| C{Ist Typ korrekt?}
B -->|Bereichsprüfung| D{Liegt Wert im Bereich?}
C -->|Ja| E[Eingabe verarbeiten]
C -->|Nein| F[Eingabe ablehnen]
D -->|Ja| E
D -->|Nein| F
Sichere Eingabe-Lesestrategien
Strategie |
Beschreibung |
Implementierung |
Puffergrenze |
Vermeidung von Pufferüberläufen |
Verwenden Sie fgets() mit Größenbeschränkung |
Eingabe-Bereinigung |
Entfernen gefährlicher Zeichen |
Implementieren Sie Zeichenfilterung |
Konvertierungsprüfung |
Validierung numerischer Konvertierungen |
Verwenden Sie strtol() mit Fehlerprüfung |
Erweiterte Eingabeverarbeitung
Sichere Zeichenketteneingabe
#define MAX_EINGABELÄNGE 100
char* secure_string_input() {
char* puffer = malloc(MAX_EINGABELÄNGE * sizeof(char));
if (puffer == NULL) {
return NULL; // Speicherallokation fehlgeschlagen
}
if (fgets(puffer, MAX_EINGABELÄNGE, stdin) == NULL) {
free(puffer);
return NULL; // Eingabe-Lesen fehlgeschlagen
}
// Entfernen Sie das abschließende Zeilenumbruchzeichen
size_t länge = strlen(puffer);
if (länge > 0 && puffer[länge-1] == '\n') {
puffer[länge-1] = '\0';
}
return puffer;
}
Beispiel für die Eingabefilterung
int filter_input(const char* input) {
// Entfernen potenziell gefährlicher Zeichen
while (*input) {
if (*input < 32 || *input > 126) {
return 0; // Nicht druckbare Zeichen ablehnen
}
input++;
}
return 1;
}
Umfassende Eingabevalidierung
int main() {
char eingabe[MAX_EINGABELÄNGE];
printf("Geben Sie eine Zahl ein: ");
if (fgets(eingabe, sizeof(eingabe), stdin) == NULL) {
fprintf(stderr, "Fehler beim Lesen der Eingabe\n");
return 1;
}
// Entfernen Sie das Zeilenumbruchzeichen
eingabe[strcspn(eingabe, "\n")] = 0;
// Validieren Sie die Eingabe
if (!validate_integer_input(eingabe)) {
fprintf(stderr, "Ungültige Eingabe\n");
return 1;
}
int zahl = atoi(eingabe);
printf("Gültige Eingabe: %d\n", zahl);
return 0;
}
Best Practices für LabEx-Lernende
- Validieren Sie immer die Eingabe, bevor Sie sie verarbeiten.
- Verwenden Sie geeignete Puffergrößen.
- Implementieren Sie eine umfassende Fehlerprüfung.
- Vertrauen Sie niemals direkt Benutzereingaben.
- Üben Sie defensive Programmiertechniken.