Einleitung: Von der Geschichte zum Problem
\n\nWenn Sie jemals mit PHP und MySQL-Datenbanken gearbeitet haben, kennen Sie sicher Code wie mysql_connect() oder mysql_query(). Noch vor 10–15 Jahren war das der De-facto-Standard. Aber die Zeiten ändern sich, und heute mysql_*-Funktionen zu verwenden, ist, als würde man versuchen, Windows 95 auf einem neuen MacBook zu starten. Es geht, aber warum sollte man?
Auf Stack Overflow hat die Frage „Why shouldn't I use mysql_* functions in PHP?“ tausende Aufrufe und hunderte Stimmen gesammelt. Das ist kein Zufall: Das Thema Sicherheit und moderne Datenbankansätze ist für jeden Entwickler entscheidend. In diesem Artikel erklären wir, warum mysql_* nicht nur „alt“, sondern regelrecht gefährlich ist, und zeigen, was Sie stattdessen verwenden sollten.
Problem Nr. 1: mysql_* wurde aus PHP 7 vollständig entfernt
\n\nDer offensichtlichste Grund: Ab PHP 5.5.0 wurden die mysql_*-Funktionen als deprecated (veraltet) markiert, und in PHP 7.0 wurden sie komplett entfernt. Wenn Ihr Server auf PHP 7+ aktualisiert wird, funktioniert jeder Code, der mysql_connect(), mysql_query() und ähnliche verwendet, einfach nicht mehr. Sie erhalten einen fatalen Fehler:
Fatal error: Call to undefined function mysql_connect()\n\nDas ist kein „könnte schiefgehen“, sondern ein garantierter Absturz Ihrer Website. Daher der erste und wichtigste Grund: Kompatibilität. Jeder Hoster wird früher oder später PHP aktualisieren, und Ihr Projekt landet in einer Sackgasse.
\n\nProblem Nr. 2: Kein Schutz vor SQL-Injection
\n\nSchauen wir uns einen typischen Code mit mysql_* an:
<?php\n$connection = mysql_connect('localhost', 'user', 'password');\nmysql_select_db('my_database', $connection);\n\n$username = $_POST['username'];\n$password = $_POST['password'];\n\n$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";\n$result = mysql_query($query, $connection);\n\nif (mysql_num_rows($result) > 0) {\n echo "Willkommen!";\n} else {\n echo "Falscher Benutzername oder Passwort";\n}\n?>\n\nSieht harmlos aus? Stellen Sie sich vor, ein Angreifer gibt im Feld username folgende Zeichenkette ein:
admin' OR '1'='1\n\nDie Abfrage wird zu:
\n\nSELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '...'\n\nUnd voilà – '1'='1' ist immer wahr, also gibt die Abfrage den ersten Eintrag der Tabelle zurück. Der Angreifer gelangt ohne Passwort ins System. Das ist eine klassische SQL-Injection. Die mysql_*-Funktionen bieten keine eingebauten Mittel zur Datenbereinigung – Sie müssen manuell mysql_real_escape_string() verwenden, das übrigens ebenfalls veraltet ist.
Vergleichen Sie das mit modernen Ansätzen, bei denen der Schutz in der Architektur integriert ist (dazu gleich mehr).
\n\nProblem Nr. 3: Veraltete Architektur und fehlender Support
\n\nmysql_* ist eine prozedurale Schnittstelle, die Folgendes nicht unterstützt:
- \n
- Prepared Statements – das wichtigste Werkzeug zum Schutz vor Injection. \n
- Objektorientierten Stil – modernes PHP arbeitet mit Objekten. \n
- Mehrere Abfragen – mehrere SQL-Befehle in einem Aufruf sind nicht möglich. \n
- Transaktionen – zwar emulierbar, aber ohne native Unterstützung. \n
- Gespeicherte Prozeduren – die Arbeit damit ist äußerst umständlich. \n
Außerdem wurde die mysql_*-Erweiterung seit 2014 nicht mehr aktualisiert. Die PHP-Entwickler haben den Support einfach eingestellt. Das bedeutet, dass alle neuen Datenbankfunktionen, Sicherheitsverbesserungen oder Optimierungen an Ihnen vorbeigehen.
Was stattdessen verwenden?
\n\nPHP bietet zwei moderne, unterstützte Alternativen: