fredericktaylor
Goto Top

Wie man unter PHP SQL-Injection, CSRF und XSS-Angriffe verhindert

Web-Sicherheit ist ein zentrales Anliegen für jeden PHP-Entwickler. SQL-Injection, CSRF (Cross-Site Request Forgery) und XSS (Cross-Site Scripting) sind häufige Sicherheitsbedrohungen. In diesem Artikel wird erläutert, wie man diese Angriffe in PHP verhindern kann.

back-to-topVerhinderung von SQL-Injection


Verwendung von Prepared Statements

Die Verwendung von Prepared Statements ist eine der effektivsten Methoden zur Verhinderung von SQL-Injection. Prepared Statements trennen die Struktur der SQL-Abfrage von den Daten und verhindern so die Injektion von bösartigem SQL-Code.

// Verwendung von PDO Prepared Statements
$pdo = new PDO("mysql:host=localhost;dbname=mydatabase", "username", "password");  

// Verwendung von benannten Platzhaltern
$statement = $pdo->prepare("SELECT * FROM users WHERE username = :username");  
$statement->bindParam(':username', $username);  
$username = $_POST['username'];  
$statement->execute();

back-to-topNiemals Benutzer-Eingaben vertrauen


Die Validierung und Filterung von Benutzereingaben ist entscheidend. Verwenden Sie Filterfunktionen, um sicherzustellen, dass der Eingabetyp dem erwarteten Typ entspricht, und validieren Sie bei Bedarf.

// Verwendung von filter_var zur Filterung von Eingaben
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);  
if ($email === false) {
    // Ungültige E-Mail-Adresse
}

back-to-topVerhinderung von CSRF-Angriffen


Verwendung von CSRF-Tokens

Generieren Sie ein eindeutiges CSRF-Token für jede Benutzersitzung und fügen Sie es in Formulare ein. Überprüfen Sie bei der Formularübermittlung, ob das Token mit der aktuellen Benutzersitzung übereinstimmt.

// Generieren des CSRF-Tokens
$csrfToken = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrfToken;  

// Einfügen des CSRF-Tokens in das Formular
echo '<input type="hidden" name="csrf_token" value="' . $csrfToken . '">';  

// Validierung des CSRF-Tokens
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {  
    // CSRF-Angriff erkannt
    die('Ungültiges CSRF-Token');  
}


Same-Origin-Policy

Stellen Sie sicher, dass Ihre Anwendung die Same-Origin-Policy einhält, die nicht zulässt, dass Seiten von verschiedenen Ursprüngen direkt auf Ihre Schnittstellen zugreifen. Verwenden Sie CORS-Header, um erlaubte Ursprünge einzuschränken.

// Setzen der CORS-Header in der Antwort
header("Access-Control-Allow-Origin: https://trusted-domain.com");  


back-to-topVerhinderung von XSS-Angriffen


Ausgabe-Escaping
Bevor Sie Benutzereingaben in HTML einfügen, verwenden Sie die Funktion `htmlspecialchars`, um die Daten zu escapen und XSS-Angriffe zu verhindern.

// Escape-Ausgabe
echo htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');  


Content Security Policy (CSP)
Verwenden Sie die Content Security Policy, um erlaubte Ressourcen zu definieren und die Ausführung von Skripten einzuschränken, wodurch XSS-Angriffe weiter verhindert werden.

// Setzen der Content Security Policy Header
header("Content-Security-Policy: default-src 'self'");  


back-to-topAllgemeine Sicherheitsempfehlungen


Aktualisiert bleiben: Halten Sie PHP, Datenbanken und andere kritische Komponenten auf dem neuesten Stand, um sicherzustellen, dass bekannte Schwachstellen gepatcht sind.
Fehlerbehandlung: Konfigurieren Sie die Fehlerbehandlung so, dass sie ausreichende Informationen für Entwickler zur Fehlerbehebung bietet, aber deaktivieren Sie detaillierte Fehlermeldungen in der Produktion.
Sitzungssicherheit: Verwenden Sie sicheres Sitzungsmanagement, stellen Sie sicher, dass Sitzungs-IDs zufällig generiert werden und verwenden Sie HTTPS, um sensible Informationen während der Übertragung zu schützen.
Datei-Uploads: Überprüfen und validieren Sie hochgeladene Dateien, erlauben Sie nur sichere Dateitypen und speichern Sie hochgeladene Dateien an sicheren Orten.
Passwortspeicherung: Verwenden Sie Hash-Algorithmen (z.B. bcrypt) zur Speicherung von Passwörtern und fügen Sie geeignete Salze hinzu.
Eingabevalidierung: Führen Sie die Eingabevalidierung auf der Serverseite durch und verlassen Sie sich nicht nur auf die clientseitige Validierung, da diese leicht umgangen werden kann.
Logging: Implementieren Sie umfassendes Logging, um Sicherheitsvorfälle bei ihrem Auftreten untersuchen zu können.

Content-ID: 4320926329

Url: https://administrator.de/contentid/4320926329

Ausgedruckt am: 21.11.2024 um 14:11 Uhr

tomolpi
tomolpi 18.06.2024 aktualisiert um 18:56:25 Uhr
Goto Top
Diese Texte schreibt ChatGPT oder eine andere KI / bzw. ein LLM, habe ich Recht? 😄
chillb3rt
chillb3rt 19.06.2024 um 07:02:20 Uhr
Goto Top
Scheinbar versucht der Nutzer nun entsprechende Artikel aus SEO Gründen zu platzieren. Wahrscheinlich muss dann in Zukunft hierbei vorgegangen werden!
maretz
maretz 19.06.2024 um 09:45:38 Uhr
Goto Top
ehrlich gesagt - für mich siehts auch aus wie bei chatgpt o.ä. einmal reingeworfen, das ergebnis da rausgekratzt und hier reingekübelt.... denn das ganze ohne sinnvolle Erklärungen warum/wieso das gemacht werden sollte (und "weil is sicherer" ist zwar eine aber nicht zwingend eine ausreichende Begründung).

Von daher - sorry, 6, setzen... Sinnlos abgeschrieben vom Nachbarn.
GNULinux
GNULinux 19.06.2024 um 10:34:38 Uhr
Goto Top
Wenn ich schon sehe, wie unnötige Variablen auch noch erst verwendet und dann deklariert werden... so ein Unfug riecht sehr nach "KI" :D
maretz
maretz 19.06.2024 um 12:52:33 Uhr
Goto Top
ebenfalls sollte man mit "die()" gerne mal vorsichtig sein -> das hat mit Fehlerhandling nix zu tun und kann dafür noch zu viel blöderen konsequenzen führen.. ne rückführung auf eine Fehlerseite (oder die Startseite) wäre da ggf. besser... aber ich vermute mal der TO fragt grad bei chatgpt nach den nächsten 50 tutorials um die ungefiltert hier einzukippen -> wäre ggf. mal ne funktionserweiterung hier -> frage eintippen und das ergebnis von cgpt direkt als manual anzeigen, würden dem TO ja min 3 tastendruck ersparen ;)
ThePinky777
ThePinky777 20.06.2024 um 16:11:53 Uhr
Goto Top
Ich persönlich habe mir in PHP ne funktion gebaut die inputs aus html forms z.B. auf bestimmte teilstrings prüft.
z.B. wenn ich erwarte das Vor und Nachname geliefert werden darf garantiert nicht ein SQL command mit rein Teilstring "Select" oder "Delete" oder sowas ... waren halt die gängigsten SQL commands drin...
ist vielleicht übertrieben aber sicher ist sicher face-smile
und wenn die funktion das halt feststellt wird er nicht das SQL command absetzen an die datenbank.
maretz
maretz 20.06.2024 um 19:18:35 Uhr
Goto Top
Zitat von @ThePinky777:

Ich persönlich habe mir in PHP ne funktion gebaut die inputs aus html forms z.B. auf bestimmte teilstrings prüft.
z.B. wenn ich erwarte das Vor und Nachname geliefert werden darf garantiert nicht ein SQL command mit rein Teilstring "Select" oder "Delete" oder sowas ... waren halt die gängigsten SQL commands drin...
ist vielleicht übertrieben aber sicher ist sicher face-smile
und wenn die funktion das halt feststellt wird er nicht das SQL command absetzen an die datenbank.

das hilft aber nur bedingt.... erstmal musst du hoffen alle befehle zu treffen. dann ist die frage was passiert mit umformatierten werten (zb als hex oder sonstwie codiert). da sind eben prepared statements in der regel besser - nur muss man das nich nur kopieren und als "manual" hier verkaufen...