Einleitung: Warum PHP für Anfänger so tückisch ist?
PHP bleibt eine der beliebtesten Sprachen für die Webentwicklung, aber seine niedrige Einstiegshürde führt oft zur Bildung schlechter Gewohnheiten. Anfängliche Entwickler, inspiriert von der Einfachheit der Syntax, vergessen häufig Sicherheit, Leistung und moderne Standards. In diesem Artikel analysieren wir die Top-Fehler von PHP-Anfängern, die Ihren Code in einen Albtraum für die Wartung und eine Schwachstelle für Angriffe verwandeln können.
Wir werden die Probleme nicht nur auflisten – Sie sehen PHP-Codebeispiele mit Fehlern und deren korrigierte Versionen. Das hilft Ihnen, die richtigen Praktiken sofort anzuwenden.
1. Ignorieren der Sicherheit: SQL-Injection und XSS
Der kritischste Fehler ist das Vertrauen in Benutzerdaten. Anfänger fügen Variablen oft direkt in SQL-Abfragen ein oder geben sie ohne Filterung auf der Seite aus.
Fehler: Konkatenation in SQL-Abfragen
Ein klassisches Beispiel für eine Schwachstelle:
// FALSCH: anfällig für SQL-Injection
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($link, $query);
Ein Angreifer kann ?id=1 OR 1=1 übergeben und alle Daten aus der Tabelle abrufen.
Lösung: Prepared Statements (PDO)
Verwenden Sie PDO oder mysqli mit vorbereiteten Anweisungen:
// RICHTIG: PDO mit Prepared Statement
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetchAll();
Fehler: Ausgabe von Daten ohne Escaping (XSS)
Wenn Sie Daten aus der Datenbank oder $_GET direkt ausgeben, riskieren Sie einen XSS-Angriff:
// FALSCH: XSS-Schwachstelle
echo "Hallo, " . $_GET['name'];
Lösung: htmlspecialchars
Escapen Sie die Ausgabe immer:
// RICHTIG: HTML-Escaping
echo "Hallo, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
2. Verwendung veralteter Konstrukte und Funktionen
Viele Lehrbücher von vor 10 Jahren lehren die Verwendung von mysql_*-Funktionen oder Short Tags. Das ist nicht nur unsicher, sondern kann auf modernen Hostings auch nicht funktionieren.
Fehler: mysql_*-Funktionen
// FALSCH: veraltete Erweiterung
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('test', $link);
Diese Erweiterung wurde aus PHP 7 entfernt, und der Code wird einfach mit einem Fehler abbrechen.
Lösung: Umstieg auf PDO oder MySQLi
// RICHTIG: PDO - moderner und sicherer Ansatz
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
Fehler: Short Tags
// FALSCH: kann in php.ini deaktiviert sein
<? echo "Hello"; ?>
Lösung: Nur vollständige Tags
// RICHTIG: immer <?php verwenden
<?php echo "Hello"; ?>
3. Schlechte Arbeit mit Formularen und Daten
Anfängliche Entwickler vergessen oft zu prüfen, ob ein Formular gesendet wurde, und verwenden $_REQUEST anstelle spezifischer Superglobal-Arrays.
Fehler: Fehlende Prüfung der Sendemethode
// FALSCH: Code wird auch bei GET-Anfrage ausgeführt
$name = $_POST['name'];
// ... Verarbeitung
Lösung: Prüfung von REQUEST_METHOD
// RICHTIG: prüfen, ob das Formular gesendet wurde
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
// ... Validierung und Verarbeitung
}
Fehler: Verwendung von $_REQUEST
Das Superglobal-Array $_REQUEST kombiniert GET, PO