Erweiterte Security Header in PHP konfigurieren

Schritt-für-Schritt-Anleitung: Origin-Agent-Cluster, X-DNS-Prefetch-Control und weitere Header in PHP — mit header()-Code, auto_prepend_file und PSR-15.

PHP · Schritt für Schritt

Erweiterte Security Header in PHP

Neben den Standard-Security-Headern gibt es erweiterte Header, die zusätzliche Schutzmechanismen bieten: Origin-Agent-Cluster für Prozessisolation, X-DNS-Prefetch-Control gegen DNS-Leaks und X-Permitted-Cross-Domain-Policies gegen Flash/PDF-Angriffe. Zusammen sind sie 4 von 166 Punkten im Wolf-Agents Web Security Check wert.

In PHP setzen Sie alle erweiterten Header per header(). Da diese Header keine Nebenwirkungen haben und auf allen Seiten gleich sein sollen, eignet sich die auto_prepend_file-Methode in der .user.ini ideal. Fügen Sie die Header einfach Ihrer bestehenden security-headers.php hinzu, die bereits die Standard-Header setzt.

Diese Header sind Quick-Wins — wenige Zeilen Code, keine Kompatibilitätsprobleme, sofortige Verbesserung. Besonders X-DNS-Prefetch-Control: off ist relevant für datenschutzsensible Anwendungen, da DNS-Prefetching IP-Adressen an DNS-Server leaken kann, bevor der Nutzer einen Link anklickt.

1 Schritt 1 von 3

Erweiterte Header in PHP konfigurieren

Drei Varianten: Direkter header()-Aufruf in der Security-Headers-Datei, auto_prepend_file für automatische Einbindung auf allen Seiten, und PSR-15-Middleware mit konstanten-basierter Konfiguration für Framework-Projekte.

security-headers.php Direkt
<?php
// security-headers.php — Erweiterte Header

if (!headers_sent()) {
    // Origin-Agent-Cluster: Prozessisolation
    header('Origin-Agent-Cluster: ?1');

    // X-DNS-Prefetch-Control: DNS-Prefetch steuern
    header('X-DNS-Prefetch-Control: off');

    // X-Download-Options: IE Download-Schutz
    header('X-Download-Options: noopen');

    // X-Permitted-Cross-Domain-Policies
    header('X-Permitted-Cross-Domain-Policies: none');
}
.user.ini Auto-Prepend
; .user.ini — Auto-Prepend für erweiterte Header
; Alle erweiterten Header werden automatisch gesetzt

auto_prepend_file = "/var/www/html/security-headers.php"

; Die security-headers.php enthält ALLE Header:
; - Standard-Header (HSTS, CSP, etc.)
; - Erweiterte Header (hier konfiguriert)
; PHP-FPM Cache-TTL: 5 Minuten
src/Middleware/AdvancedHeadersMiddleware.php PSR-15
<?php
// src/Middleware/AdvancedHeadersMiddleware.php — PSR-15

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class AdvancedHeadersMiddleware implements MiddlewareInterface
{
    private const HEADERS = [
        'Origin-Agent-Cluster' => '?1',
        'X-DNS-Prefetch-Control' => 'off',
        'X-Download-Options' => 'noopen',
        'X-Permitted-Cross-Domain-Policies' => 'none',
    ];

    public function process($request, $handler): ResponseInterface
    {
        $response = $handler->handle($request);
        foreach (self::HEADERS as $name => $value) {
            $response = $response->withHeader($name, $value);
        }
        return $response;
    }
}
Structured Field Values

Der Wert von Origin-Agent-Cluster ist ?1 (Structured Field Boolean). Das ist keine normale Header-Syntax — der Browser erwartet exakt dieses Format. true oder 1 funktionieren nicht.

2 Schritt 2 von 3

Konfiguration verifizieren

Prüfen Sie alle vier erweiterten Header per curl. Alle müssen auf PHP-generierten Seiten gesetzt sein. Für statische Dateien brauchen Sie zusätzlich die Webserver-Konfiguration.

Terminal Verifizierung
# Erweiterte Header prüfen
curl -sI https://ihre-domain.de | grep -iE \
  "origin-agent|x-dns|x-download|x-permitted"

# Erwartete Ausgabe:
Origin-Agent-Cluster: ?1
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none

# Statische Dateien auch testen:
curl -sI https://ihre-domain.de/style.css | grep -iE "origin-agent|x-dns"
Nutzen Sie den Wolf-Agents Web Security Check für eine vollständige Prüfung aller 4 Punkte der erweiterten Header.
3 Schritt 3 von 3

Häufige Fehler

Headers already sent

Der häufigste PHP-Fehler: header() nach einer Ausgabe aufrufen. Nutzen Sie auto_prepend_file — die Header-Datei wird garantiert vor jeder Ausgabe geladen. Eine BOM oder Leerzeichen vor <?php zählt als Ausgabe.

Origin-Agent-Cluster Wert falsch

Der Wert muss ?1 sein (Structured Field Boolean), nicht true, 1 oder yes. Falsche Werte werden vom Browser ignoriert und die Prozessisolation greift nicht.

X-DNS-Prefetch-Control bremst Performance

Das Deaktivieren von DNS-Prefetching erhöht die Latenz beim ersten Request zu externen Domains. Für Anwendungen mit vielen externen Ressourcen wägen Sie Sicherheit gegen Performance ab — bei reinen Same-Origin-Anwendungen ist off optimal.

Statische Dateien ohne Header

PHP header() wirkt nur für PHP-Dateien. Statische Assets brauchen die Header über die Webserver-Konfiguration (Apache/Nginx). Ohne die Webserver-Konfiguration fehlen die erweiterten Header auf CSS, JS und Bildern.

Compliance-Relevanz

OWASP ASVS — V14.4 — Umfassende Security-Header-Konfiguration für alle Webanwendungen.
NIS2 — Art. 21(e) — Sicherheit bei Entwicklung und Wartung von Netz- und Informationssystemen.
BSI — APP.3.1 — Konfiguration aller verfügbaren Security-Header für maximalen Schutz.

Wie steht Ihre Domain bei Erweiterte Header?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.