Cross-Origin Headers in PHP konfigurieren
Schritt-für-Schritt-Anleitung: CORP, COEP und COOP in PHP einrichten — Cross-Origin-Isolation mit header()-Code, auto_prepend_file und PSR-15.
Cross-Origin Headers in PHP
Cross-Origin Headers (CORP, COEP, COOP) schützen vor Spectre-Angriffen und Cross-Origin-Datenlecks. Sie isolieren Ihren Browsing-Kontext und kontrollieren, welche Cross-Origin-Ressourcen geladen werden dürfen. Mit 30 von 166 Punkten im Wolf-Agents Web Security Check sind diese drei Header zusammen der zweitgrößte Scoring-Block.
In PHP setzen Sie alle drei Header per header(). COOP und CORP sind unkompliziert und haben keine Nebenwirkungen bei Same-Origin-Anwendungen. COEP erfordert dagegen sorgfältige Tests — es blockiert alle Cross-Origin-Ressourcen, die kein CORS oder crossorigin-Attribut haben. Externe Fonts, CDN-Scripts und Drittanbieter-Bilder können betroffen sein.
Wie bei allen PHP-Headern gilt: header() muss vor jeder Ausgabe aufgerufen werden. Die auto_prepend_file-Methode in der .user.ini garantiert das. Für Framework-Projekte empfehlen wir die PSR-15-Middleware, die alle drei Header in einer Klasse bündelt.
Cross-Origin Headers in PHP konfigurieren
Drei Implementierungsvarianten: Direkter header()-Aufruf, auto_prepend_file für automatische Einbindung, oder PSR-15-Middleware für Frameworks. Bei allen Varianten werden COOP, CORP und COEP zusammen gesetzt — sie ergänzen sich gegenseitig für vollständige Cross-Origin-Isolation.
<?php
// security-headers.php — Cross-Origin Headers
if (!headers_sent()) {
// COOP — Browsing-Kontext isolieren
header('Cross-Origin-Opener-Policy: same-origin');
// CORP — Ressourcen vor Cross-Origin-Zugriff schuetzen
header('Cross-Origin-Resource-Policy: same-origin');
// COEP — nur mit expliziter Erlaubnis laden
// Vorsicht: Blockiert Cross-Origin-Ressourcen ohne CORS
header('Cross-Origin-Embedder-Policy: require-corp');
} ; .user.ini — Auto-Prepend fuer Cross-Origin Headers
auto_prepend_file = "/var/www/html/security-headers.php"
; Die security-headers.php wird vor jedem PHP-Script
; geladen — Cross-Origin Headers werden garantiert
; vor jeder Ausgabe gesetzt.
;
; PHP-FPM Cache-TTL: 5 Minuten
; Nach Aenderung: systemctl restart php-fpm <?php
// src/Middleware/CrossOriginMiddleware.php — PSR-15
namespace App\Middleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class CrossOriginMiddleware implements MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface {
$response = $handler->handle($request);
return $response
->withHeader('Cross-Origin-Opener-Policy',
'same-origin')
->withHeader('Cross-Origin-Resource-Policy',
'same-origin')
->withHeader('Cross-Origin-Embedder-Policy',
'require-corp');
}
} require-corp) zuerst in einer Staging-Umgebung. Dieser Header blockiert alle Cross-Origin-Ressourcen ohne CORS — Google Fonts, Analytics-Scripts und CDN-Bilder können betroffen sein. Als Alternative können Sie credentialless statt require-corp verwenden. Konfiguration verifizieren
Prüfen Sie alle drei Header mit curl. Wichtig: Testen Sie sowohl PHP-generierte Seiten als auch statische Dateien. PHP header() wirkt nur für PHP-Dateien — statische Assets brauchen die Webserver-Konfiguration.
# Cross-Origin Headers pruefen
curl -sI https://ihre-domain.de | grep -i cross-origin
# Erwartete Ausgabe:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
# Statische Dateien testen (brauchen Webserver-Config):
curl -sI https://ihre-domain.de/style.css | grep -i cross-origin Häufige Fehler
Headers already sent
PHP gibt den Fehler "Headers already sent", wenn header() nach einer Ausgabe aufgerufen wird. Nutzen Sie auto_prepend_file — die Header-Datei wird garantiert vor jeder Ausgabe geladen. Eine BOM oder ein Leerzeichen vor <?php zählt bereits als Ausgabe.
COEP blockiert CDN-Ressourcen
require-corp blockiert alle Cross-Origin-Ressourcen ohne CORS-Header. Google Fonts, CDN-Scripts und externe Bilder funktionieren nicht mehr. Lösung: credentialless statt require-corp verwenden oder alle externen Ressourcen mit crossorigin="anonymous" laden.
COOP bricht window.opener
same-origin trennt den Browsing-Kontext. window.opener wird null. Payment-Popups (PayPal, Stripe) und OAuth-Fenster verlieren die Verbindung zum Elternfenster. Für Seiten mit Popups verwenden Sie same-origin-allow-popups.
CORP blockiert API-Responses
Wenn Sie same-origin auf API-Endpunkten setzen, können Frontend-Apps auf anderen Domains nicht auf die API zugreifen. Für öffentliche APIs verwenden Sie cross-origin. Setzen Sie CORP kontextabhängig — nicht pauschal für alle PHP-Dateien.
Compliance-Relevanz
Wie steht Ihre Domain bei Cross-Origin Headers?
Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.