mysql_* Funktionen in PHP: Warum sie gefährlich sind + Lösungen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Von der Geschichte zum Problem

\n\n

Wenn 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?

\n\n

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.

\n\n

Problem Nr. 1: mysql_* wurde aus PHP 7 vollständig entfernt

\n\n

Der 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:

\n\n
Fatal error: Call to undefined function mysql_connect()
\n\n

Das 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\n

Problem Nr. 2: Kein Schutz vor SQL-Injection

\n\n

Schauen wir uns einen typischen Code mit mysql_* an:

\n\n
<?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\n

Sieht harmlos aus? Stellen Sie sich vor, ein Angreifer gibt im Feld username folgende Zeichenkette ein:

\n\n
admin' OR '1'='1
\n\n

Die Abfrage wird zu:

\n\n
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '...'
\n\n

Und 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.

\n\n

Vergleichen Sie das mit modernen Ansätzen, bei denen der Schutz in der Architektur integriert ist (dazu gleich mehr).

\n\n

Problem Nr. 3: Veraltete Architektur und fehlender Support

\n\n

mysql_* ist eine prozedurale Schnittstelle, die Folgendes nicht unterstützt:

\n\n
    \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
\n\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.

\n\n

Was stattdessen verwenden?

\n\n

PHP bietet zwei moderne, unterstützte Alternativen:

Blogs

Buchempfehlungen