# PSR-standarder fra PHP-FIG

> PSR-standarder fra PHP-FIG: alle PSR'er fra 0 til 22 med status, de vigtigste i praksis og hvad PSR-3, PSR-4 og PSR-7 betyder for sikkerheden.

Kilde: https://phpsos.de/da/php/psr-standards/  
Status: 25.10.2026  
Udbyder: PHP SOS, PHP-nødhjælp og serversikkerhed. Akut hjælp på WhatsApp: https://wa.me/491736494914?text=Hej%20PHP%20SOS%2C%20vi%20har%20brug%20for%20hj%C3%A6lp%20med%20vores%20PHP-server.%20Firma%3A%20%E2%80%A6%20Website%3A%20%E2%80%A6

**Kort sagt:** PSR'er (PHP Standards Recommendations) er standarder fra PHP-FIG, en gruppe af etablerede PHP-projekter. De fastlægger fælles regler og grænseflader, f.eks. PSR-4 til autoloading, PSR-3 til loggere, PSR-7 til HTTP-meddelelser og PSR-11 til containere. Hver PSR har en status: accepteret, udkast, forældet eller opgivet. PSR'er gør kode mere udskiftelig og lettere at kontrollere, men lukker ingen sårbarheder i PHP-fortolkeren som PHP2Shell.

## Hvad er PHP-FIG, og hvad er PSR'er?

PHP-FIG står for PHP Framework Interop Group. Gruppen beskriver selv sit mål som at udvikle PHP gennem samarbejde og standarder. Bag en PSR står altså ingen producent, men en afstemning mellem projekter, der vil holde deres software indbyrdes kompatibel.

For beslutningstagere er nytten konkret: Overholder en applikation PSR-grænseflader, kan man for eksempel udskifte logningsbiblioteket uden at røre ved hele koden. Det mindsker afhængigheden af enkelte pakker og tjenesteudbydere.

## En PSR's vej: fra pre-draft til accepted

PHP-FIG's vedtægter beskriver et fast forløb:

1. **Pre-Draft:** Det afklares, om der er interesse nok. En arbejdsgruppe dannes, og efter en vellykket afstemning får forslaget et PSR-nummer.
2. **Draft:** Forslaget udarbejdes, alternativer og begrundelser kommer i et metadokument.
3. **Review:** Fællesskabet tester specifikationen med prøveimplementeringer, mindst fire uger og indtil to uafhængige, bæredygtige implementeringer foreligger.
4. **Accepted:** Efter en vellykket afstemning er PSR'en vedtaget; arbejdsgruppen opløses.

Derudover findes der to andre tilstande. **Deprecated** betyder: vedtaget, men ikke længere anbefalet, oftest fordi en nyere standard afløser den. **Abandoned** betyder: Der arbejdes ikke længere på den.

## Alle PSR'er med status

Status ifølge PHP-FIG's oversigt på tidspunktet for denne side:

| Nr. | Titel | Status |
|---|---|---|
| PSR-0 | Autoloading Standard | forældet |
| PSR-1 | Basic Coding Standard | accepteret |
| PSR-2 | Coding Style Guide | forældet |
| PSR-3 | Logger Interface | accepteret |
| PSR-4 | Autoloading Standard | accepteret |
| PSR-5 | PHPDoc Standard | udkast |
| PSR-6 | Caching Interface | accepteret |
| PSR-7 | HTTP Message Interface | accepteret |
| PSR-8 | Huggable Interface | opgivet |
| PSR-9 | Security Advisories | opgivet |
| PSR-10 | Security Reporting Process | opgivet |
| PSR-11 | Container Interface | accepteret |
| PSR-12 | Extended Coding Style Guide | accepteret |
| PSR-13 | Hypermedia Links | accepteret |
| PSR-14 | Event Dispatcher | accepteret |
| PSR-15 | HTTP Handlers | accepteret |
| PSR-16 | Simple Cache | accepteret |
| PSR-17 | HTTP Factories | accepteret |
| PSR-18 | HTTP Client | accepteret |
| PSR-19 | PHPDoc tags | udkast |
| PSR-20 | Clock | accepteret |
| PSR-21 | Internationalization | udkast |
| PSR-22 | Application Tracing | udkast |

## De vigtigste PSR'er i praksis

- **PSR-4 (autoloading):** afbilder klassenavne på filstier og er grundlaget for Composer-autoloaderen. Detaljer på siden [Namespaces og autoloading](https://phpsos.de/da/php/namespaces-autoloading/).
- **PSR-1 og PER Coding Style:** fælles regler for skrivemåde og formatering. PER Coding Style udvider og afløser ifølge PHP-FIG PSR-12 og forudsætter PSR-1.
- **PSR-3 (logger):** ensartet logger-grænseflade i namespace'et `Psr\Log` med otte niveauer fra `emergency` til `debug`.
- **PSR-7, PSR-15, PSR-17, PSR-18 (HTTP):** grænseflader til forespørgsler og svar, middleware, factories og HTTP-klienter. Mange [PHP-frameworks](https://phpsos.de/da/php/php-frameworks/) bygger på dem eller tilbyder broer.
- **PSR-11 (container):** fælles grænseflade til dependency-injection-containere.
- **PSR-6 og PSR-16 (cache):** to grænseflader til mellemlagre, en udførlig og en enkel.
- **PSR-14 og PSR-20 (events, ur):** fælles grænseflader til hændelser og til det aktuelle tidspunkt. Et udskifteligt ur gør tidsafhængig kode, f.eks. udløb af tokens, let at teste.

Numrene siger i øvrigt intet om betydningen. De tildeles ved indtræden i udkastfasen, og derfor står forældede og opgivne forslag mellem vigtige, accepterede standarder.

```php
<?php
use Psr\Log\LoggerInterface;

final class Bestellimport
{
    public function __construct(private LoggerInterface $log) {}

    public function importieren(string $datei): void
    {
        try {
            // ... behandl filen ...
        } catch (\Throwable $e) {
            $this->log->error('Import von {datei} fehlgeschlagen', [
                'datei'     => basename($datei),
                'exception' => $e,
            ]);
        }
    }
}
```

## Hvad PSR'er har med sikkerhed at gøre

Flere standarder berører sikkerheden direkte. PSR-3 fastlægger, at exceptions gives videre under nøglen `exception` i konteksten, og at pladsholdere som `{datei}` erstattes fra konteksten. Værdier må herved ikke maskeres på forhånd, fordi loggeren ikke ved, hvor de senere vises. Den, der viser logs i en weboverflade, skal maskere dér. Mere om det i indlægget [Log sikkert](https://phpsos.de/da/blog/sicher-loggen-php/).

PSR-7 beskriver HTTP-meddelelser som uforanderlige objekter og tilbyder med `UploadedFileInterface::moveTo()` en ensartet vej til at gemme uploadede filer. Specifikationen kræver, at originalfilen er fjernet bagefter. Kontrollen af filtype og bestemmelsessted forbliver applikationens opgave.

Bemærkelsesværdigt er det, at PSR-9 (Security Advisories) og PSR-10 (Security Reporting Process) blev opgivet. Der findes dermed ingen fælles standard for sikkerhedsmeddelelser; hvert projekt regulerer det selv. Hvordan PHP-projektet selv omgås sårbarheder, beskriver siden [Sådan behandler PHP-projektet sikkerhedssårbarheder](https://phpsos.de/da/php/php-sicherheitsprozess/).

Mod PHP2Shell hjælper standarder ikke: Sårbarhederne CVE-2026-109618 og CVE-2026-109619 ligger i fortolkeren. Et must er opdateringen til PHP 8.5.12, 8.4.27, 8.3.36 eller 8.2.35 og genstart af alle PHP-processer.

## Hvordan hjælper PHP SOS konkret?

- Vi undersøger, hvordan jeres applikation logger, og sikrer, at exceptions havner i loggen, men ingen adgangsdata eller sessions-id'er.
- Vi vurderer, hvordan upload- og HTTP-behandling er gennemført, også når de kører via PSR-7-biblioteker.
- Vi gennemgår egenudviklinger som led i et [sikkerhedsaudit og penetrationstest](https://phpsos.de/da/leistungen/sicherheitsaudit-penetrationstest/).
- Vi indspiller PHP-opdateringer, genstarter alle workers og dokumenterer status.


## Ofte stillede spørgsmål

**Hvad betyder PSR?**  
PSR står for PHP Standards Recommendation. Anbefalingerne udarbejdes og vedtages af PHP-FIG, PHP Framework Interop Group. De er frivillige, men gennemføres af mange frameworks og biblioteker.

**Gælder PSR-12 stadig?**  
PSR-12 føres fortsat som accepteret hos PHP-FIG. PHP-FIG har dog med PER Coding Style udgivet en efterfølger, som ifølge dens egen angivelse udvider og afløser PSR-12. Aktuelt er dér version 3.1.

**Findes der en PSR for sikkerhedsmeddelelser?**  
Der var to forslag, PSR-9 for security advisories og PSR-10 for processen til indberetning af sårbarheder. Begge føres hos PHP-FIG som opgivet. Projekter regulerer derfor selv deres indberetningsproces.

**Skal mit projekt overholde PSR'er?**  
Nej, der er ingen pligt. PSR-4 til autoloading og grænseflader som PSR-3 eller PSR-7 gør dog brugen af fremmede pakker og skift af tjenesteudbydere betydeligt lettere.

## Kilder

- [PHP-FIG: PSR-oversigt](https://www.php-fig.org/psr/)
- [PHP-FIG: PSR-workflow](https://www.php-fig.org/bylaws/psr-workflow/)
- [PHP-FIG: PER Coding Style](https://www.php-fig.org/per/coding-style/)
- [PHP-FIG: PSR-3 Logger Interface](https://www.php-fig.org/psr/psr-3/)
- [PHP-FIG: PSR-7 HTTP Message Interface](https://www.php-fig.org/psr/psr-7/)
