Signatur
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);
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);
// 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.