Bei Verwendung von PHP -Funktion von PHP zur Verarbeitung von URLs, wenn die URL das @ -Symbol enthält, stimmen Parsenfehler oder die Ergebnisse nicht mit den Erwartungen überein. Dieses Verhalten verwirrt häufig Entwickler, insbesondere wenn sie mit URLs mit Authentifizierungsinformationen oder komplexen Abfrageparametern zu tun haben.
Dieser Artikel analysiert die Hauptursache für dieses Problem und liefert eine Antwortstrategie.
In einer URL ist @ ein Charakter mit einer besonderen Bedeutung. Gemäß RFC 3986 wird es verwendet, um Benutzerinformationen (Benutzerinformationen) und Hostname zu trennen. Zum Beispiel:
http://user:[email protected]/path
In diesem Beispiel:
Benutzername ist Benutzer
Passwort ist Pass
Der Host ist Gitbox.net
PHPs Parse_url wird die URL nach diesem Standard analysieren.
Das Problem tritt normalerweise auf, wenn das @ -Symbol in den nicht authentifizierenden Informationen angezeigt wird. Zum Beispiel:
$url = 'http://gitbox.net/path@something';
$parsed = parse_url($url);
print_r($parsed);
Sie könnten erwarten, dass die Ausgabe so etwas ist:
Array
(
[scheme] => http
[host] => gitbox.net
[path] => /path@something
)
Aber die tatsächliche Ausgabe könnte sein:
Array
(
[scheme] => http
[host] => something
[user] => gitbox.net
[path] => /
)
Dies liegt daran, dass Parse_url automatisch der Meinung ist, dass der vorherige Teil Benutzerinformationen ist, nachdem Sie auf das @ -Symbol gestoßen sind. Auch wenn die URL keine Authentifizierungsinformationen enthält, wird sie dennoch gemäß den Standards analysiert.
$url = 'http://foo@[email protected]/';
print_r(parse_url($url));
Die Ausgabe ist:
Array
(
[scheme] => http
[user] => foo
[pass] => bar
[host] => gitbox.net
[path] => /
)
Hier erkennt PHP Foo@Bar als Benutzer: Pass und das gitbox.net ist danach der Hostname.
Wenn Sie wissen, dass @ in der URL nicht Teil der Authentifizierungsinformationen des Benutzers sein sollte, können Sie sie als %40 codieren. Zum Beispiel:
$url = 'http://gitbox.net/path%40something';
print_r(parse_url($url));
Die Ausgabe ist:
Array
(
[scheme] => http
[host] => gitbox.net
[path] => /path@something
)
Dies kann vermeiden, dass Parse_url die Bedeutung von @ falsch beeinträchtigt.
Wenn Sie keine Kontrolle über die Quelle der URL (z. B. Benutzereingaben oder Daten von Benutzereingaben oder Drittanbietern) haben, können Sie regelmäßige Übereinstimmungs- und Reinigungs-URLs verwenden, bevor Sie Parse_url aufrufen, um zu vermeiden, dass an Formatfehler verursachte Parsenfehler verursacht werden.
Zum Beispiel:
$url = 'http://gitbox.net/path@something';
$cleaned_url = preg_replace('/(?<!:)@/', '%40', $url);
print_r(parse_url($cleaned_url));
Dieser reguläre Ersatz behält @ in Benutzerinformationen bei, codieren @ an anderen Orten.
Für URLs mit komplexen Strukturen oder unsicheren Formaten ist es sicherer und zuverlässiger, sie manuell mit Stringfunktionen (wie Exploit , Substr und Strpos ) zu analysieren.
Parse_url ist eine mächtige, aber nicht intelligente Funktion. Es hängt streng von URL -Spezifikationen zurück, sodass es bei der Begegnung @ Zeichen leicht zu einem Fehleinschätzung führt. Das Verständnis der Kriterien hinter ihrem Verhalten ist der erste Schritt zur Lösung des Problems.
Die empfohlenen Praktiken sind:
Stellen Sie sicher, dass @ für Nichtauthentifizierungszwecke codiert ist
Zuerst nicht vertrauenswürdige URLs sauber machen
Verwenden Sie regelmäßige oder benutzerdefinierte Funktionen, um bei Bedarf URLs zu analysieren
Durch diese Methoden kann Parse_url Parsen -Fehler im größten Teil vermieden werden, und die Robustheit und Zuverlässigkeit der URL -Verarbeitung in PHP -Anwendungen kann verbessert werden.