Sichere Zeichenkettenverarbeitung
Verständnis der Sicherheitsrisiken bei Zeichenketten
Häufige Schwachstellen
- Pufferüberlauf
- Korruption des Speichers
- Unbeabsichtigte Modifikationen
Techniken der defensiven Programmierung
Eingabevalidierung
int safe_copy(char *dest, size_t dest_size, const char *src) {
if (dest == NULL || src == NULL || dest_size == 0) {
return -1;
}
strncpy(dest, src, dest_size - 1);
dest[dest_size - 1] = '\0';
return 0;
}
Empfohlene sichere Funktionen
Unsichere Funktion |
Sichere Alternative |
Beschreibung |
strcpy() |
strncpy() |
Begrenzte Zeichenkettenkopie |
strcat() |
strncat() |
Begrenzte Zeichenkettenverkettung |
sprintf() |
snprintf() |
Begrenzte Zeichenkettenformatierung |
Strategien für die Speicherverwaltung
flowchart TD
A[Zeichenkettenverarbeitung] --> B{Speicherallokierung}
B --> |Statisch| C[Vordefinierte Puffergröße]
B --> |Dynamisch| D[malloc/calloc]
B --> |Sichere Bibliotheken| E[strlcpy/strlcat]
Beispiel für sichere Zeichenkettenmanipulation
#include <stdio.h>
#include <string.h>
#define MAX_BUFFER 50
int main() {
char buffer[MAX_BUFFER];
const char *input = "LabEx Sicheres Programmieren Tutorial";
if (strlen(input) >= MAX_BUFFER) {
fprintf(stderr, "Eingabe zu lang\n");
return 1;
}
strncpy(buffer, input, MAX_BUFFER - 1);
buffer[MAX_BUFFER - 1] = '\0';
printf("Sicher kopiert: %s\n", buffer);
return 0;
}
Erweiterte Sicherheitstechniken
Grenzenprüfung
- Verwenden Sie Compilerflags wie
-fstack-protector
- Implementieren Sie benutzerdefinierte Grenzenprüfungen
- Nutzen Sie statische Analysetools
Muster für Fehlerbehandlung
enum StringOperationResult {
ERFOLG = 0,
FEHLER_PUFFERÜBERLAUF = -1,
FEHLER_NULLZEIGER = -2
};
int safe_operation(char *dest, size_t dest_size, const char *src) {
if (dest == NULL || src == NULL) {
return FEHLER_NULLZEIGER;
}
if (strlen(src) >= dest_size) {
return FEHLER_PUFFERÜBERLAUF;
}
strcpy(dest, src);
return ERFOLG;
}
Sicherheitsrichtlinien von LabEx
- Überprüfen Sie immer die Zeichenkettenlängen.
- Verwenden Sie Funktionen mit Grenzen für Zeichenketten.
- Implementieren Sie eine umfassende Fehlerbehandlung.
- Validieren Sie alle externen Eingaben.
Checkliste für Best Practices
- Vertrauen Sie niemals nicht validierten Eingaben.
- Geben Sie immer Puffergrößen an.
- Verwenden Sie sichere Zeichenkettenmanipulationsfunktionen.
- Implementieren Sie eine korrekte Fehlerbehandlung.
- Führen Sie umfassende Tests durch.