URL-Encoding/Decoding
bechte
- browser
Hallo,
ich frage mich grade, ob es eine technische Dokumentation gibt, in der erfasst ist, dass ein Browser die Angabe bei Attribut "href" im <a>-Tag zu decodieren hat?
Vom Standard her wird ja verlangt, dass im "href" Attribut eine URL angegeben wird. D.h. man muss ungültige Zeichen codieren.
Bei den Event-Handlern, z.B. onclick, wird dies nicht erwartet. D.h. man muss bei der Umsetzung schon höllisch aufpassen, wo man codiert und wo nicht.
Frage mich mich ist nun einfach, ob es dazu irgendwo ein Paper gibt, das dieses Verhalten genau Spezifiziert.
Über einen Link würde ich mich sehr freuen.
Schöne Grüße,
bechte
Hi,
ich frage mich grade, ob es eine technische Dokumentation gibt, in der erfasst ist, dass ein Browser die Angabe bei Attribut "href" im <a>-Tag zu decodieren hat?
der Browser hat eine HTML-Dekodierung vorzunehmen, wenn er einen Wert aus dem HTML-Kontext herauslöst. Erwartet wird nach dieser Dekodierung eine korrekte URI.
Vom Standard her wird ja verlangt, dass im "href" Attribut eine URL angegeben wird. D.h. man muss ungültige Zeichen codieren.
Bei den Event-Handlern, z.B. onclick, wird dies nicht erwartet.
Aber selbstverständlich muss der entsprechende Wert einer HTML-Kodierung unterzogen werden, schließlich wird er in den HTML-Kontext gebracht. Eine URL-Kodierung hingegen wäre völlig falsch, weil nirgendwo ein Wert in einen URL-Kontext gebracht wird.
D.h. man muss bei der Umsetzung schon höllisch aufpassen, wo man codiert und wo nicht.
Nein. Man muss *immer* eine kontextspezifische Kodierung vornehmen, wenn man einen Wert in einen Kontext bringt. Ohne jede Ausnahme.
Cheatah
Hi und erstmal danke für die Antwort.
Leider entspricht die nicht genau dem was ich eigentlich wissen wollte. Mir ist bewusst, dass ich kodieren muss. Auch weiß ich wo und wann und wie ich kodieren muss. Ich möchte nur wissen, ob es irgendwo eine Spezifikation dafür gibt! Muss es doch... wurde doch implementiert von den Browsern...
Schöne Grüße,
bechte
Moin!
Leider entspricht die nicht genau dem was ich eigentlich wissen wollte. Mir ist bewusst, dass ich kodieren muss. Auch weiß ich wo und wann und wie ich kodieren muss. Ich möchte nur wissen, ob es irgendwo eine Spezifikation dafür gibt! Muss es doch... wurde doch implementiert von den Browsern...
Werd' mal konkret und bringe Beispiele, die dir unklar sind. Dann muß man nicht so im luftleeren Raum operieren.
- Sven Rautenberg
<html>
<head><title>Testlinks</title></head>
<body>
<p>bei href...</p>
<a href="javascript:window.open('https%3A%2F%2Ftestserver%2Ftest.php%3Fparam1%3Dtest%26extparam2%3DHallo%2520Welt');">funktioniert</a>
<a href="javascript:window.open('https://testserver/test.php?param1=test&extparam2=Hallo%20Welt');">funktioniert nicht</a>
<p>während bei onclick...<p>
<a href="#" onclick="window.open('https%3A%2F%2Ftestserver%2Ftest.php%3Fparam1%3Dtest%26extparam2%3DHallo%2520Welt');">funktioniert nicht</a>
<a href="#" onclick="window.open('https://testserver/test.php?param1=test&extparam2=Hallo%20Welt');');">funktioniert</a>
</body>
</html>
Also für meinen Fall ist es einfach so, dass wir im Query String einen Parameter haben, der selbst einen codierten Value beinhaltet, sprich im Endeffekt liegt eine doppelte Codierung vor (siehe bei "Hallo%2520Welt").
Im href wird die erste Decodierung vorgenommen, sprich im Browser bleibt "Hallo%20Welt" stehen.
Im onclick wird dies nicht automatisch vom Browser erledigt, sprich hier muss man den Wert direkt einfach Codiert angeben.
Das ist das unterschiedliche Verhalten, von dem ich gesprochen habe...
Man muss pro Attribut prüfen, welchen Typ man übergeben muss. Und es muss doch irgendwo eine Spezifikation geben, die beschreibt, dass der Browser die Zeichenkette beim href Attribut einmal decodieren muss. Interessant ist, dass sich hier alle Browser gleich verhalten.
Schöne Grüße,
bechte
Hi,
Das ist das unterschiedliche Verhalten, von dem ich gesprochen habe...
das Verhalten ist absolut einheitlich. Lediglich die Kontexte sind verschieden.
Man muss pro Attribut prüfen, welchen Typ man übergeben muss.
Nein, pro Kontext. Die Attribute spielen nur insofern eine Rolle, als sie bestimmte Werte erwarten: das href-Attribut erwartet eine URL, ein Event-Handler Script-Code, das title-Attribut einen Text.
Und es muss doch irgendwo eine Spezifikation geben, die beschreibt, dass der Browser die Zeichenkette beim href Attribut einmal decodieren muss.
Das ist absolut unnötig. Es geht um Kontexte, und wie man mit Kontexten umgeht hat nicht das geringste mit Browsern zu tun.
Interessant ist, dass sich hier alle Browser gleich verhalten.
Triviale Implementierung von Grundprinzipien ;-) Man kann hier im Grunde nichts falsch machen; es sei denn, man versteift sich darauf, dass irgendwelche besonderen Fälle vorliegen. Dem ist jedoch nicht so.
Cheatah
Hi,
<a href="javascript:window.open('https%3A%2F%2Ftestserver%2Ftest.php%3Fparam1%3Dtest%26extparam2%3DHallo%2520Welt');">funktioniert</a>
der Wert "https://testserver/test.php?param1=test&extparam2=Hallo%20Welt" wurde (u.a.) in einen URL-Kontext gebracht, nämlich in eine URL des Pseudo-Protokolls "javascript:", also muss eine URL-Kodierung vorgenommen werden.
<a href="#" onclick="window.open('https://testserver/test.php?param1=test&extparam2=Hallo%20Welt');');">funktioniert</a>
Der Wert "https://testserver/test.php?param1=test&extparam2=Hallo%20Welt" wird hier nirgendwo in einen URL-Kontext gebracht. Sehr wohl aber in einen HTML-Kontext, vergiss also bitte nicht die HTML-Kodierung.
Cheatah
Hi,
Ich möchte nur wissen, ob es irgendwo eine Spezifikation dafür gibt! Muss es doch... wurde doch implementiert von den Browsern...
ich bin nicht sicher, ob es für Grundprinzipien der Programmierung bzw. Software-Entwicklung noch eine Spezifikation geben muss. Der Grundsatz, einen Wert kontextspezifisch kodieren zu müssen, wenn man ihn in einen Kontext bringt, ist absolut überall uneingeschränkt gültig, nicht nur im Browser - und eigentlich nicht mal nur in der Software-Entwicklung. Betrachte ihn als Naturgesetz.
Cheatah