Start · Sprachen · PHP · Referenz · Uri\UriComparisonMode

Uri\UriComparisonMode

Enum

Definiert die Vergleichsmodi für URI-Objekte in der URI-Erweiterung und steuert, wie zwei URIs auf Gleichheit geprüft werden.

seit PHP 8.4.0 Kategorie: misc

Signatur

enum Uri\UriComparisonMode: int

Beschreibung

Das Enum Uri\UriComparisonMode ist Teil der in PHP 8.4 eingeführten URI-Erweiterung und wird zusammen mit Methoden wie Uri\Uri::equals() verwendet, um festzulegen, nach welchem Regelwerk zwei URI-Objekte verglichen werden sollen.

Es stehen unterschiedliche Modi zur Verfügung, die bestimmen, ob der Vergleich strikt zeichengenau (raw) oder nach den in RFC 3986 definierten Normalisierungsregeln (normalized) erfolgt. Bei der normalisierten Variante werden etwa Prozentkodierungen und Groß-/Kleinschreibung von Schema und Host angeglichen, bevor der Vergleich stattfindet.

Der richtige Modus hängt vom Anwendungsfall ab: Für sicherheitskritische Prüfungen, bei denen exakte Übereinstimmung wichtig ist, empfiehlt sich der Rohvergleich, während für allgemeine URI-Gleichheitsprüfungen der normalisierte Modus praxisnäher ist.

Beispiele

Normalisierter URI-Vergleich

<?php
$uri1 = Uri\Uri::parse('HTTP://Example.COM/path/%61');
$uri2 = Uri\Uri::parse('http://example.com/path/a');

// Normalisierter Vergleich: true, da Schema/Host case-insensitiv
// und %61 === 'a' bei der Normalisierung aufgelöst wird
$result = $uri1->equals($uri2, Uri\UriComparisonMode::NormalizePercentEncoding | Uri\UriComparisonMode::NormalizeCase);
var_dump($result);
bool(true)

Strikter Rohvergleich zweier URIs

<?php
$uri1 = Uri\Uri::parse('HTTP://Example.COM/path/%61');
$uri2 = Uri\Uri::parse('http://example.com/path/a');

// Rohvergleich: false, da Schreibweise und Kodierung unterschiedlich sind
$result = $uri1->equals($uri2, Uri\UriComparisonMode::IdenticalString);
var_dump($result);
bool(false)

// Wichtig · Fallstricke

Die genauen verfügbaren Cases des Enums (z. B. IdenticalString, NormalizeCase, NormalizePercentEncoding) können als Bitmaske kombiniert werden, da es sich um ein Integer-Backed-Enum handelt. Lesen Sie stets die aktuelle PHP-Dokumentation, da sich die Cases in frühen 8.4-Versionen noch ändern könnten.

Beachten Sie, dass eine zu lockere Vergleichseinstellung in sicherheitsrelevanten Kontexten (z. B. beim Prüfen von Callback-URIs) dazu führen kann, dass manipulierte URIs als gleichwertig durchgehen. Wählen Sie den Modus daher sorgfältig.