Zum Hauptinhalt springen

Warum ist die PHP-Funktion shell_exec() deaktiviert?

Dieser Artikel erklärt die Hintergründe dieser Sicherheitsmaßnahme, welche Auswirkungen dies auf deine Anwendungen hat und welche sicheren Alternativen dir zur Verfügung stehen.

Verfasst von Neele de Jonge

Was passiert bei der Nutzung von shell_exec()?

In unserer Hosting-Umgebung ist die PHP-Funktion shell_exec() (sowie ähnliche Funktionen wie exec(), system() oder passthru()) standardmäßig deaktiviert.

Wenn ein Skript oder Plugin versucht, diese Funktion zu nutzen, erhältst du in der Regel eine Fehlermeldung, die wie folgt aussieht:

Warning: shell_exec() has been disabled for security reasons in /pfad/zu/deiner/datei.php on line X

Warum ist die Funktion deaktiviert?

Die Funktion shell_exec() erlaubt es einem PHP-Skript, Befehle direkt auf der Kommandozeile des Betriebssystems (dem Server) auszuführen.

In einer Shared-Hosting-Umgebung, in der sich mehrere Kunden einen Server teilen, stellt dies ein erhebliches Sicherheitsrisiko dar:

  • Schutz vor Schadcode: Sollte eine Schwachstelle in deiner Website (z. B. in einem veralteten Plugin) ausgenutzt werden, könnten Angreifer über shell_exec() die Kontrolle über Serverprozesse übernehmen.

  • Stabilität und Performance: Unsachgemäß ausgeführte Systembefehle können die Serverleistung beeinträchtigen und somit auch die Websites anderer Kunden auf demselben Server stören.

💡Um die maximale Sicherheit und Performance für alle Nutzer zu gewährleisten, ist diese Funktion systemseitig gesperrt.

Auswirkungen auf deine Projekte

Da direkte Systemaufrufe aus PHP heraus blockiert sind, kann es bei bestimmten Anwendungen zu Einschränkungen kommen:

  • Deployment-Skripte & CLI-Tools: Skripte, die beispielsweise über PHP automatisch den Composer (composer install) oder Git (git pull) aufrufen wollen, funktionieren nicht.

  • Backup-Plugins: Einige Plugins versuchen, Server-Dienste wie zip oder mysqldump über die Kommandozeile auszuführen, anstatt PHP-eigene Funktionen zu nutzen.

  • Bildbearbeitung: Versuche, ImageMagick über den Kommandozeilen-Befehl convert auszuführen, schlagen fehl.

Mögliche Alternativen und Lösungswege

Du musst auf die gewünschte Funktionalität nicht verzichten. Für fast alle Anwendungsfälle gibt es sichere und native Alternativen:

1. Native PHP-Funktionen nutzen

Viele Entwickler nutzen shell_exec() aus Bequemlichkeit für Aufgaben, die PHP bereits von Haus aus beherrscht:

  • Statt Dateisystem-Befehle (wie ls, rm, cp) über die Shell auszuführen, nutze die PHP-Funktionen scandir(), unlink() oder copy().

  • Statt Archive per Shell-Befehl zu packen, verwende die PHP-Klasse ZipArchive.

  • Für die Bildbearbeitung nutze die PHP-Erweiterungen GD-Library oder Imagick, anstatt Systembefehle aufzurufen.

2. Nutzung von APIs (Schnittstellen)

Wenn dein Skript externe Daten abrufen oder mit anderen Servern kommunizieren soll (häufig über Shell-Befehle wie curl oder wget gelöst), verwende stattdessen die in PHP integrierte cURL-Bibliothek (curl_exec) oder file_get_contents().

3. Automatisierung über Cronjobs

Wenn du Hintergrundprozesse oder regelmäßige Aufgaben ausführen möchtest, musst du diese nicht über PHP in der Shell anstoßen. Nutze stattdessen ein Plugin wie WP Control. Dort kannst du PHP-Skripte erstellen und zeitgesteuert und sicher direkt vom Server ausführen lassen.

4. Direkter SSH-Zugang (falls in deinem Tarif enthalten)

⚠️Wichtig: Bitte prüfe, ob SSH in deinem Tarif verfügbar ist.

Die Deaktivierung von shell_exec() betrifft nur die Ausführung über PHP (z. B. beim Aufruf einer Webseite). Wenn du als Administrator manuell Tools wie Composer, WP-CLI oder Git nutzen möchtest, kannst du dich regulär per SSH auf deinem Webspace einloggen und diese Befehle direkt in der Konsole ausführen.

Hat dies deine Frage beantwortet?