- Susam Pal entfernte den Query-Parameter
via=, den er Wander Console hinzugefügt hatte, nachdem er Chris Morgans Beitrag I banned query strings gelesen hatte
- Wander Console ist eine verteilte, selbst gehostete Web-Konsole, mit der Besucher persönlicher Websites zufällig Seiten erkunden können, die von einer Community empfohlen werden; derzeit wird sie auf mehr als 50 Websites gehostet und empfiehlt über 1500 Webseiten
- Die
via=-Funktion ermöglichte es Betreibern empfohlener Websites, in ihren Zugriffslogs die Herkunft von Besuchen zu sehen, änderte dafür aber die Ziel-URL direkt, etwa wie bei https://midnight.pub/?via=https://susam.net/wander/
- Das Anhängen eines Query-Strings erzeugt eine neue URL, die auf eine andere Ressource zeigen oder einen 404 auslösen kann, und beschädigte tatsächlich Websites wie die Font-Seite von
int10h.org, die Query-Strings als eigene Kennungen verwendet
- Da Browser bereits Referer und Referrer-Policy besitzen, um die Übermittlung von Herkunftsinformationen zu steuern, fügt Wander Console ab Version 0.6.0 keine Query-Strings zur Empfehlungsherkunft mehr an fremde URLs an
Kritik von Chris Morgan an Query-Strings war der Auslöser
- Susam Pal las Chris Morgans Beitrag I banned query strings und entfernte daraufhin den Query-Parameter
via=, den er seinem Projekt Wander Console hinzugefügt hatte
- Chris Morgan möchte nicht, dass andere Tracking-Informationen an seine URLs anhängen, etwa wie bei
https://chrismorgan.info/no-query-strings?ref=example.com
- Wenn Herkunftsinformationen nötig sind, kann man den HTTP-Header
Referer ansehen; fehlt dieser Header, gibt es dafür wahrscheinlich einen guten Grund
- Susam Pal hatte bereits früher aus Chris Morgans detailliertem Feedback zu seinen CSS-Boilerplate-Regeln auf Hacker News gelernt, etwa Unterstreichungen bei Links und die violette Farbe besuchter Links beizubehalten
- Seitdem liest er weiter Chris Morgans Web-bezogene Texte und Rückmeldungen und nennt auch den jüngsten Kommentar zu Lobsters, Adding author context to RSS, als nützliches Beispiel
Aufbau und Zweck von Wander Console
- Wander Console ist eine kleine, verteilte und selbst hostbare Web-Konsole, mit der Besucher persönlicher Websites interessante Websites und Seiten erkunden können, die von einer Community unabhängiger Betreiber persönlicher Websites empfohlen werden
- Susam Pals Konsole befindet sich unter susam.net/wander/; wenn man auf die Schaltfläche
Wander klickt, wird eine zufällige persönliche Webseite geladen, die von der Wander-Community empfohlen wurde
- Das Werkzeug besteht aus einer HTML-Datei, die die Konsole implementiert, und einer JavaScript-Datei, in der Website-Betreiber die Liste benachbarter Konsolen und die Liste empfohlener Webseiten definieren
- Kopiert man diese beiden Dateien auf einen Webserver, lässt sich das Ganze mit einem gewöhnlichen Webserver betreiben; separate serverseitige Logik oder serverseitige Software ist nicht nötig
- Es kann auch in eingeschränkten Umgebungen wie Codeberg Pages oder GitHub Pages gehostet werden
- Beim Klick auf die Schaltfläche
Wander verbindet sich die Konsole mit anderen entfernten Konsolen, holt Empfehlungen für Webseiten, wählt eine davon zufällig aus und lädt sie im Browser
- Es ist dem eingestellten StumbleUpon ein wenig ähnlich, unterscheidet sich aber dadurch, dass es vollständig verteilt ist
- Es ist auch Webrings ein wenig ähnlich, doch das Community-Netzwerk ist nicht auf eine Kreisstruktur beschränkt und kann jede beliebige Form eines Graphen annehmen
- Derzeit hosten mehr als 50 Websites dieses Werkzeug und empfehlen zusammen mehr als 1500 Webseiten
- Einen aktuellen Schnappschuss bekannter Konsolen und empfohlener Seiten gibt es unter susam.codeberg.page/wcn/
- Wer mehr über das Werkzeug erfahren oder es auf der eigenen Website einrichten möchte, kann in codeberg.org/susam/wander nachsehen
Der fehlerhafte Query-Parameter via=
- In Wander Console 0.4.0 wurde eine Funktion hinzugefügt, die beim Laden von Webseiten den Query-Parameter
via= anhängt
- Wenn man zum Beispiel in der Konsole unter susam.net/wander/ auf midnight.pub stieß, wurde die Seite unter folgender URL geladen
https://midnight.pub/?via=https://susam.net/wander/
- Dadurch konnten Betreiber der empfohlenen Website in ihren Zugriffslogs sehen, dass der Besuch von Wander Console kam
- Die Funktion wurde nach einer Feature-Anfrage auf Codeberg hinzugefügt, allerdings gab es anfangs Zögern
- Damals näherte sich die Abgabefrist für Forschung zu algebraischer Graphentheorie, und auch der Großteil von Wander Console entstand in kurzen Pausen während dieser Arbeit
- Die erste Version der Konsole wurde an einem frühen Morgen in etwa anderthalb Stunden erstellt, und auch die
via=-Funktion wurde in einer ähnlichen kurzen Pause implementiert
- Susam Pal bevorzugt bei kleinen Hobbyprojekten eine Wartungsweise, bei der der Umfang begrenzt bleibt und Funktionen, sobald die wesentlichen Anforderungen erfüllt sind, als abgeschlossen gelten, statt ständig neue Funktionen hinzuzufügen
- Trotzdem meint er, dass er wegen Erschöpfung und der intensiven Forschungsarbeit diese Feature-Anfrage nicht ignorieren konnte
- Für die
via=-Funktion gab es eine Einstellung zum Deaktivieren, doch später hielt er auch das für einen Fehler
- Bei fragwürdigen Funktionen sollte man, selbst wenn man sie implementiert, nicht von standardmäßig aktiviert zu deaktivierbar ausgehen, sondern explizite Aktivierung verlangen
- Das Jurassic-Park-Zitat, man sei so beschäftigt damit gewesen, ob man es könne, dass man nicht darüber nachgedacht habe, ob man es solle, passe hier gut
Query-Strings beschädigen echte URLs
- Nach der Implementierung der
via=-Funktion ließ sich eine Seite einer Website, die er mochte, in der Konsole nicht laden
- Die betroffene Seite hatte unter anderem diese ähnlichen, aber leicht unterschiedlichen URLs
- Die erste und die zweite URL laden korrekt, die dritte liefert jedoch eine HTTP-404-Fehlerseite zurück
- Die Website verwendet Query-Strings, um zu bestimmen, welche Font-Sammlung von mehreren angezeigt werden soll
- Hängt man einen beliebigen Query-String an, versucht die Website, ihn als Kennung einer Font-Sammlung zu interpretieren, wodurch das Laden der Seite fehlschlägt
- Aus demselben Grund wurde auch die Seite beschädigt, wenn Wander Console an die erste URL den Query-Parameter
via= anhängte
- Sobald man eine URL verändert, wird selbst eine scheinbar kleine Änderung wie das Hinzufügen eines Query-Strings zu einer neuen URL
- Diese neue URL kann auf eine völlig andere Ressource zeigen oder auf gar keine Ressource
- Susam Pal kam zu dem Schluss, dass er durch das Anhängen des Query-Strings
via= die korrekte URL einer von ihm geschätzten Website beschädigt hatte
Problematische Umgehung von Referer und Referrer-Policy
- Webbrowser haben bereits den HTTP-Header Referer für Herkunftsinformationen
- Dieser Header wird durch Referrer-Policy gesteuert
- Referrer-Policy kann auf Serverebene, auf Dokumentebene und auf Ebene einzelner Links festgelegt werden
- Webstandards bieten also bereits bewusst vorgesehene Kontrollmechanismen dafür, welcher Umfang an Herkunftsinformationen gesendet wird
- Das Anhängen eines Query-Strings für die Empfehlungsherkunft an die URL umgeht diese Kontrollen
- Datenschutz- und Herkunftsfragen werden damit aus dem Referrer-Mechanismus herausgenommen und direkt in die Ziel-URL eingebettet
- Er kam zu dem Schluss, dass HTML-Werkzeuge URLs auf diese Weise nicht verändern sollten
- Auch das eigenmächtige Ändern von URLs im Namen des Nutzers, um einen Query-String zur Empfehlungsherkunft einzufügen, hält er an sich für falsch
Entfernung der Funktion und Grundsätze für die Zukunft
- Die Funktion für Query-Strings zur Empfehlungsherkunft wurde aus Wander Console entfernt
- Man hätte sie als Option zur expliziten Aktivierung beibehalten können, doch nachdem er sie als falsche Funktion eingestuft hatte, wollte er sie in keiner Form in der Software belassen
- Da das Projekt noch neu ist und sich noch in der 0.x-Releasephase befindet, hielt er das für einen guten Zeitpunkt, die Funktion zu entfernen
- Als Chris Morgans Beitrag I banned query strings in seinem Feed-Reader auftauchte, nahm er sich kurz Zeit von der Forschung, um die Funktion zu entfernen
- Die Änderung ist im Commit b26d77c zu sehen
- In der aktuellen Version 0.6.0 ist die Funktion nicht mehr enthalten
- Für zukünftige Hobbyprojekte, die URLs laden, setzt er sich den Grundsatz, sie genau so zu laden, wie es die Website-Autoren beabsichtigt haben
- Er kommt zu dem Schluss, dass er fremden URLs keine Query-Strings hinzufügen wird
1 Kommentare
Lobste.rs-Kommentare
Danke, dass du mir gesagt hast, wie mein Beitrag dir geholfen hat. Es gibt verschiedene Gründe, warum ich ausführliche Reviews schreibe: zu meiner eigenen Zufriedenheit, um das ursprüngliche Projekt zu unterstützen, manchmal weil der Entwickler Interesse zeigt und manchmal auch nicht, und auch weil jemand im Internet falsch lag
Aber der größte Grund ist, dass ich gerne lehre und weiß, dass andere Leute diese Reviews lesen. Tatsächlich gehören meine Reviews regelmäßig zu den am meisten hochgevoteten Kommentaren
Ich schätze Dankeskommentare von Unbekannten gelegentlich wirklich sehr, und so ein ausführlicher Dank fühlt sich noch wärmer an
Lustigerweise habe ich deine Website im Januar entdeckt und mochte besonders „more purple links, please“, und heute habe ich festgestellt, dass ich offenbar, ohne es zu wissen, deine Haltung beeinflusst habe
Gestern habe ich eine neue Website veröffentlicht, und ich plane, künftig viel mehr Reviews in verschiedenen Medien zu veröffentlichen. Letzten Monat habe ich diesen Plan ein wenig aufgeschrieben: https://lobste.rs/s/vpdpkq/llm_reviews_cargo_crev#c_8uk441
Es hat mich auch ein wenig überrascht, dass es bereits noch ein weiteres Beispiel für eine Seite gab, die auf zusätzliche Query-Strings allergisch reagiert. Auf dieser Site werden Query-Strings nur auf genau dieser Seite für das Routing von Unterseiten verwendet, etwa
?1,?2,?3,?4, während andere Seiten Query-Strings akzeptieren. Sequentielle Paginierung ist offensichtlich hierarchisch und widerspricht damit dem Geist von URLs, aber etwas wie?page=1ist dennoch verbreitetAls ich überlegt habe, welchen Statuscode ich zurückgeben soll, hatte ich Sorge, dass 404 wegen falscher Annahmen Nebenwirkungen haben könnte, aber vielleicht war diese Sorge übertrieben. Ich hatte vergessen, dass ein beträchtlicher Teil des Webs Pfade nicht sinnvoll verwendet
"418 I'm not a teapot"zu antworten?Schön. Die Wander console entwickelt sich großartig, und die Sorgfalt, die Susam hier zeigt, scheint ein großer Grund dafür zu sein, dass es funktioniert
Ich habe auch bei meinen URLs einige Varianten gesehen, bei denen unerwünschte Query-Strings angehängt werden. Der Programmer Weekly Newsletter hängt Queries an, obwohl es auch einen Referer-Header gibt, also ist das redundant
In einem anderen Fall scheint pro Abonnent eine eindeutige ID angehängt zu werden, was ich überhaupt nicht möchte. Ärgerlicherweise gibt es keinen Referer, sodass ich nicht einmal weiß, welche Site das macht
/blog/modeling-on-demand-pricing/?ck_subscriber_id=<unique-id>Ich würde gern der Aussage zustimmen: „Wenn du es wissen willst, schau auf den Referer-Header, und wenn keiner da ist, gibt es vermutlich einen guten Grund dafür“, aber Referer ist seit Jahren in gewissem Maß kaputt oder nutzlos. Das ist der einzige Grund, warum solche Dinge überhaupt entstanden sind
„Warum habe ich es hinzugefügt? Ich habe dem öffentlichen Druck nachgegeben“ — wirklich? Das war nur ein lockerer Kommentar mit 5 Upvotes unter einem themenfremden Issue. So heftig scheint der Kampf vor dem Nachgeben nicht gewesen zu sein ;-)
Als dieses Projekt zu einem Zeitpunkt, als es vielleicht nur etwa zehn Nutzer hatte, einen Vorschlag für eine neue Funktion mit 5 Upvotes bekam, fühlte sich das für mich durchaus nach öffentlicher Nachfrage an
Meine Projekte sind meist kleine Werkzeuge, die ich als Hobby baue. Abgesehen von einigen Ausnahmen haben sie nicht viele Nutzer. Deshalb sind Funktionswünsche oder Bug-Reports für mich wichtig, egal ob in einem relevanten oder irrelevanten Issue. Ich kann mich nicht immer sofort darum kümmern, aber ich merke mir, welche Anfragen mehr Nachfrage bekommen haben