dedlfix: htmlspecialchars() und urlencode()

Beitrag lesen

echo $begrüßung;

Was davon funktioniert denn nun nur, weil die Browser oder der Webserver tolerant sind?

<p><img src="testdateien/umleitung0cy.gif" alt="ohne Leerzeichen" /></p>

Klarer Fall.

<p><img src="testdateien/kopie von umleitung cy.gif" alt="mit Leerzeichen" /></p>

Für HTML ist das ein klarer Fall, weil das Attribut in "" eingeschlossen ist. Wenn der Browser allerdings

GET /testdateien/kopie von umleitung cy.gif HTTP/1.0

auf die Reise schickt, bekommt er Probleme mit der HTTP-RFC, die im Abschnitt 5.1 ein

Method SP Request-URI SP HTTP-Version CRLF

anführt, also Leerzeichen (SP) zwischen den Bestandteilen vorsieht. Er wird also von sich aus die zum gültigen Request nötigen Handlungen ausführen müssen, um keinen Bug-Report zu kassieren. Löst man Request-URI nach den gültigen Zeichen auf, wozu auch RFC 2396 benötigt wird, findet man darunter kein Leerzeichen.

<p><img src="testdateien/kopie%20von%20umleitung%20cy.gif" alt="mit Leerzeichen encoded" /></p>

Hier wurde dem Browser quasi in vorauseilendem Gehorsam seine Arbeit abgenommen.

eine, die nicht funktioniert:
<p><img src=testdateien/kopie von umleitung cy.gif alt="mit Leerzeichen" /></p>

Ganz klar, sind doch Leerzeichen unter HTML als Trennzeichen zwischen den Attributen reserviert. Hier hast du das Attribut alt, src mit dem Inhalt testdateien/kopie und noch drei weitere Attribute namens von, umleitung und cy.gif.

und dann doch wieder:
<p><img src=testdateien/kopie%20von%20umleitung%20cy.gif alt="mit Leerzeichen encoded" /></p>

Kein Leerzeichen, also alles ein Attribut-Wert.

Das hatte mich auf die Idee mit urlencode gebracht. :-|
Aber es würde hier sowieso nur rawurlencode funktionieren und dann auch nicht auf den gesamten Pfad angewandt, sondern nur auf seine einzelnen Teile.

Genau so. urlencode() ist für Daten im Query-Teil zu verwenden, rawurlencode() für Bestandteile der URL, nicht aber für die regulären Trennzeichen (: als Schema-Trenner, / als Pfad-Trenner, ? als Query-Trenner, & oder ; oder was auch immer man verwenden mag (abzüglich #) als Query-Parameter-Trenner, und # für den Anker).

echo "$verabschiedung $name";