Aktuelle Lage: PHP2Shell. Zwei kritische PHP-Lücken (CVSS 9.2) erlauben Schadcode ohne Anmeldung. Patches seit 21.10.2026.Was jetzt zu tun ist →

PSR-Standards der PHP-FIG

PSRs sind gemeinsame Standards, auf die sich viele PHP-Projekte geeinigt haben. Diese Seite listet alle PSRs mit Status und zeigt, welche im Alltag zählen und wo sie die Sicherheit berühren.

Stand 5 Min. LesezeitPHP-Wissen

Kurz gesagt: PSRs (PHP Standards Recommendations) sind Standards der PHP-FIG, einer Gruppe etablierter PHP-Projekte. Sie legen gemeinsame Regeln und Schnittstellen fest, etwa PSR-4 für das Autoloading, PSR-3 für Logger, PSR-7 für HTTP-Nachrichten und PSR-11 für Container. Jeder PSR hat einen Status: akzeptiert, Entwurf, veraltet oder aufgegeben. PSRs machen Code austauschbarer und leichter prüfbar, schließen aber keine Lücken im PHP-Interpreter wie PHP2Shell.

Was ist die PHP-FIG und was sind PSRs?

PHP-FIG steht für PHP Framework Interop Group. Die Gruppe beschreibt ihr Ziel selbst damit, PHP durch Zusammenarbeit und Standards voranzubringen. Hinter einem PSR steht also kein Hersteller, sondern eine Abstimmung zwischen Projekten, die ihre Software untereinander kompatibel halten wollen.

Für Entscheider ist der Nutzen greifbar: Hält sich eine Anwendung an PSR-Schnittstellen, lässt sich etwa die Logging-Bibliothek austauschen, ohne den ganzen Code anzufassen. Das senkt die Abhängigkeit von einzelnen Paketen und Dienstleistern.

Der Weg eines PSR: von Pre-Draft bis Accepted

Die Satzung der PHP-FIG beschreibt einen festen Ablauf:

  1. Pre-Draft: Es wird geklärt, ob genug Interesse besteht. Eine Arbeitsgruppe bildet sich, nach erfolgreicher Abstimmung erhält der Vorschlag eine PSR-Nummer.
  2. Draft: Der Vorschlag wird ausgearbeitet, Alternativen und Begründungen kommen in ein Meta-Dokument.
  3. Review: Die Gemeinschaft testet die Spezifikation mit Probe-Implementierungen, mindestens vier Wochen lang und bis zwei unabhängige, tragfähige Umsetzungen vorliegen.
  4. Accepted: Nach erfolgreicher Abstimmung ist der PSR angenommen; die Arbeitsgruppe löst sich auf.

Daneben gibt es zwei weitere Zustände. Deprecated bedeutet: angenommen, aber nicht mehr empfohlen, meist weil ein neuerer Standard ihn ersetzt. Abandoned bedeutet: Es wird nicht mehr daran gearbeitet.

Alle PSRs mit Status

Stand laut Übersicht der PHP-FIG zum Zeitpunkt dieser Seite:

Nr. Titel Status
PSR-0 Autoloading Standard veraltet
PSR-1 Basic Coding Standard akzeptiert
PSR-2 Coding Style Guide veraltet
PSR-3 Logger Interface akzeptiert
PSR-4 Autoloading Standard akzeptiert
PSR-5 PHPDoc Standard Entwurf
PSR-6 Caching Interface akzeptiert
PSR-7 HTTP Message Interface akzeptiert
PSR-8 Huggable Interface aufgegeben
PSR-9 Security Advisories aufgegeben
PSR-10 Security Reporting Process aufgegeben
PSR-11 Container Interface akzeptiert
PSR-12 Extended Coding Style Guide akzeptiert
PSR-13 Hypermedia Links akzeptiert
PSR-14 Event Dispatcher akzeptiert
PSR-15 HTTP Handlers akzeptiert
PSR-16 Simple Cache akzeptiert
PSR-17 HTTP Factories akzeptiert
PSR-18 HTTP Client akzeptiert
PSR-19 PHPDoc tags Entwurf
PSR-20 Clock akzeptiert
PSR-21 Internationalization Entwurf
PSR-22 Application Tracing Entwurf

Die wichtigsten PSRs für die Praxis

  • PSR-4 (Autoloading): bildet Klassennamen auf Dateipfade ab und ist die Grundlage des Composer-Autoloaders. Details auf der Seite Namespaces und Autoloading.
  • PSR-1 und PER Coding Style: gemeinsame Regeln für Schreibweise und Formatierung. PER Coding Style erweitert und ersetzt laut PHP-FIG den PSR-12 und setzt PSR-1 voraus.
  • PSR-3 (Logger): einheitliche Logger-Schnittstelle im Namespace Psr\Log mit acht Stufen von emergency bis debug.
  • PSR-7, PSR-15, PSR-17, PSR-18 (HTTP): Schnittstellen für Anfragen und Antworten, Middleware, Fabriken und HTTP-Clients. Viele PHP-Frameworks bauen darauf auf oder bieten Brücken an.
  • PSR-11 (Container): gemeinsame Schnittstelle für Dependency-Injection-Container.
  • PSR-6 und PSR-16 (Cache): zwei Schnittstellen für Zwischenspeicher, eine ausführliche und eine einfache.
  • PSR-14 und PSR-20 (Events, Uhr): gemeinsame Schnittstellen für Ereignisse und für die aktuelle Zeit. Eine austauschbare Uhr macht zeitabhängigen Code, etwa das Ablaufen von Tokens, gut testbar.

Die Nummern sagen übrigens nichts über die Bedeutung aus. Sie werden beim Eintritt in die Entwurfsphase vergeben, deshalb stehen veraltete und aufgegebene Vorschläge zwischen wichtigen, akzeptierten Standards.

<?php
use Psr\Log\LoggerInterface;

final class Bestellimport
{
    public function __construct(private LoggerInterface $log) {}

    public function importieren(string $datei): void
    {
        try {
            // ... Datei verarbeiten ...
        } catch (\Throwable $e) {
            $this->log->error('Import von {datei} fehlgeschlagen', [
                'datei'     => basename($datei),
                'exception' => $e,
            ]);
        }
    }
}

Was PSRs mit Sicherheit zu tun haben

Mehrere Standards berühren die Sicherheit direkt. PSR-3 legt fest, dass Exceptions unter dem Schlüssel exception im Kontext übergeben werden und Platzhalter wie {datei} aus dem Kontext ersetzt werden. Werte sollen dabei nicht vorab maskiert werden, weil der Logger nicht weiß, wo sie später angezeigt werden. Wer Logs in einer Weboberfläche anzeigt, muss dort maskieren. Mehr dazu im Beitrag Sicher loggen.

PSR-7 beschreibt HTTP-Nachrichten als unveränderliche Objekte und bietet mit UploadedFileInterface::moveTo() einen einheitlichen Weg, hochgeladene Dateien zu speichern. Die Spezifikation verlangt, dass die Originaldatei danach entfernt ist. Die Prüfung von Dateityp und Zielort bleibt Aufgabe der Anwendung.

Bemerkenswert ist, dass PSR-9 (Security Advisories) und PSR-10 (Security Reporting Process) aufgegeben wurden. Einen gemeinsamen Standard für Sicherheitsmeldungen gibt es damit nicht; jedes Projekt regelt das selbst. Wie das PHP-Projekt selbst mit Lücken umgeht, beschreibt die Seite Wie das PHP-Projekt Sicherheitslücken behandelt.

Gegen PHP2Shell helfen Standards nicht: Die Lücken CVE-2026-109618 und CVE-2026-109619 liegen im Interpreter. Pflicht ist das Update auf PHP 8.5.12, 8.4.27, 8.3.36 oder 8.2.35 und der Neustart aller PHP-Prozesse.

Wie hilft PHP SOS konkret?

  • Wir prüfen, wie Ihre Anwendung loggt, und stellen sicher, dass Exceptions im Log landen, aber keine Zugangsdaten oder Sitzungskennungen.
  • Wir bewerten, wie Upload- und HTTP-Verarbeitung umgesetzt sind, auch wenn sie über PSR-7-Bibliotheken laufen.
  • Wir untersuchen Eigenentwicklungen im Rahmen eines Sicherheitsaudits und Penetrationstests.
  • Wir spielen PHP-Updates ein, starten alle Worker neu und dokumentieren den Stand.

Häufige Fragen

Was bedeutet PSR?

PSR steht für PHP Standards Recommendation. Die Empfehlungen werden von der PHP-FIG, der PHP Framework Interop Group, erarbeitet und abgestimmt. Sie sind freiwillig, werden aber von vielen Frameworks und Bibliotheken umgesetzt.

Gilt PSR-12 noch?

PSR-12 ist bei der PHP-FIG weiterhin als akzeptiert geführt. Die PHP-FIG hat aber mit PER Coding Style eine Nachfolge veröffentlicht, die PSR-12 laut eigener Aussage erweitert und ersetzt. Aktuell ist dort Version 3.1.

Gibt es einen PSR für Sicherheitsmeldungen?

Es gab zwei Vorschläge, PSR-9 für Security Advisories und PSR-10 für den Prozess zur Meldung von Sicherheitslücken. Beide sind bei der PHP-FIG als aufgegeben geführt. Projekte regeln ihren Meldeprozess deshalb selbst.

Muss mein Projekt PSRs einhalten?

Nein, es gibt keine Pflicht. PSR-4 für das Autoloading und die Schnittstellen wie PSR-3 oder PSR-7 erleichtern aber den Einsatz fremder Pakete und den Wechsel von Dienstleistern deutlich.

Quellen

Sofort-Kontakt

Jede Stunde zählt. Schreiben Sie uns jetzt.

Schildern Sie kurz System, PHP-Version und Beobachtung. Wir melden uns, klären die Lage und arbeiten remote, bis der Vorfall abgeschlossen und dokumentiert ist.

Sofort-Hilfe