Zum Inhalt springen

„Query-String“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Aufbau: Trennzeichen präzisiert
tk k
Zeile 1: Zeile 1:
Die '''[[Abfragesprache|Query]]-Komponente''', häufig auch '''Query-String''' ([[Englische Sprache|englisch]] für ''Abfrage-[[Zeichenkette]]''), ist Teil eines [[Uniform Resource Locator]]s (URL) im [[World Wide Web]] und in RFC 3986 spezifiziert.<ref name="RFC-3986" /> Die Query-Komponente enthält Daten, häufig in Form von benannten [[Parameter (Informatik)|Parametern]], die an einen [[Web-Server]] gesendet und vom nachgeschalteten Server-Teil einer [[Webanwendung]] ausgewertet werden können.
Die '''[[Abfragesprache|Query]]-Komponente''', häufig auch '''Query-String''' ([[Englische Sprache|englisch]] für ''Abfrage-[[Zeichenkette]]''), ist Teil eines [[Uniform Resource Locator]]s (URL) im [[World Wide Web]] und in <nowiki>RFC&nbsp;3986</nowiki> spezifiziert.<ref name="RFC-3986" /> Die Query-Komponente enthält Daten, häufig in Form von benannten [[Parameter (Informatik)|Parametern]], die an einen [[Web-Server]] gesendet und vom nachgeschalteten Server-Teil einer [[Webanwendung]] ausgewertet werden können.


== Aufbau ==
== Aufbau ==


Ein Query-String wird mit einem [[Fragezeichen]] (<code>?</code>) eingeleitet und endet mit einem [[Doppelkreuz (Schriftzeichen)|Doppelkreuz]] (<code>#</code>) oder dem Ende des URLs. Er besteht oft aus einem oder mehreren Parametern, häufig in Form von Schlüssel-Wert-Paaren, die oft mit einem [[Et-Zeichen]] (<code>&</code>) voneinander getrennt werden. Parametername und -wert werden durch ein [[Uniform Resource Locator#Liste erlaubter Zeichen|reserviertes Zeichen]], meist ein [[Gleichheitszeichen]] (<code>=</code>), getrennt. Die genannten Trennzeichen entsprechen der Vorgabe des [[World Wide Web Consortium]]s (W3C) für die Übertragung von [[HTML-Formular]]-Daten.<ref name="W3C-Query-Delimiter" />
Ein Query-String wird mit einem [[Fragezeichen]] (<code>?</code>) eingeleitet und endet mit einem [[Doppelkreuz (Schriftzeichen)|Doppelkreuz]] (<code>#</code>) oder dem Ende des URLs. Er besteht oft aus einem oder mehreren Parametern, häufig in Form von Schlüssel-Wert-Paaren, die oft mit einem [[Et-Zeichen]] (<code>&</code>) voneinander getrennt werden. Parametername und -wert werden durch ein [[Uniform Resource Locator#Liste erlaubter Zeichen|reserviertes Zeichen]], meist ein [[Gleichheitszeichen]] (<code>=</code>), getrennt. Die genannten Trennzeichen entsprechen der Vorgabe des [[World Wide Web Consortium]]s (W3C) für die Übertragung von [[HTML-Formular]]-Daten.<ref name="W3C-Query-Delimiter" />


Der folgende URL enthält den Query-String <code>stichwort=wiki&ausgabe=liste</code>:
Der folgende URL enthält den Query-String <code>stichwort=wiki&ausgabe=liste</code>:
Zeile 14: Zeile 14:


Ein Webformular ist folgendermaßen implementiert:
Ein Webformular ist folgendermaßen implementiert:
{{#tag:syntaxhighlight

|<form action="suche.php" method="get">
<syntaxhighlight lang="html4strict">
<form action="suche.php" method="get">
<label for="stichwort">Suche nach</label>
<label for="stichwort">Suche nach</label>
<input type="text" name="stichwort" id="stichwort" />
<input type="text" name="stichwort" id="stichwort" />
<input type="hidden" name="suchdatum" value="{{#time:Y-m-d}}" />

<input type="hidden" name="suchdatum" value="2019-11-27" />

<input type="submit" value="Suche starten" />
<input type="submit" value="Suche starten" />
</form>
</form>
|lang=html4strict}}
</syntaxhighlight>


Zu beachten ist dabei das verborgene (<code>type="hidden"</code>) Feld <code>suchdatum</code>. Es ist im Browser nicht sichtbar, wird beim Absenden des Formulars aber dennoch Teil des Query-Strings. Die Submit-Schaltfläche wird hingegen nicht in den Query-String aufgenommen, da für diese keine Bezeichnung (<code>name</code>) vergeben wurde. Gibt der Benutzer in das Textfeld das Stichwort „wiki“ ein und sendet das Formular ab, wird beispielsweise folgender URL mit dem entsprechenden Query-String <code>stichwort=wiki&suchdatum=2019-11-27</code> generiert:
Zu beachten ist dabei das verborgene (<code>type="hidden"</code>) Feld <code>suchdatum</code>. Es ist im Browser nicht sichtbar, wird beim Absenden des Formulars aber dennoch Teil des Query-Strings. Die Submit-Schaltfläche wird hingegen nicht in den Query-String aufgenommen, da für diese keine Bezeichnung (<code>name</code>) vergeben wurde. Gibt der Benutzer in das Textfeld das Stichwort „wiki“ ein und sendet das Formular ab, wird beispielsweise folgender URL mit dem entsprechenden Query-String <code style="white-space:nowrap">stichwort=wiki&suchdatum={{#time:Y-m-d}}</code> generiert:


<code><nowiki>http://<server>/suche.php?stichwort=wiki&suchdatum=</nowiki>2019-11-27</code>
<code><nowiki>http://<server>/suche.php?stichwort=wiki&suchdatum=</nowiki>{{#time:Y-m-d}}</code>


=== Auswertung (in PHP) ===
=== Auswertung (in PHP) ===
Zeile 34: Zeile 31:
In [[PHP]] lässt sich der Query-String abfragen. Dabei ist der Inhalt des Query-Strings als [[Feld (Datentyp)|Array]] verfügbar.
In [[PHP]] lässt sich der Query-String abfragen. Dabei ist der Inhalt des Query-Strings als [[Feld (Datentyp)|Array]] verfügbar.


<syntaxhighlight lang="php">echo $_GET['stichwort'];</syntaxhighlight>
<syntaxhighlight lang="php">
echo $_GET['stichwort'];
</syntaxhighlight>


gibt beispielsweise den Text aus, der in das Suchfeld eingetragen wurde.
gibt beispielsweise den Text aus, der in das Suchfeld eingetragen wurde.


<syntaxhighlight lang="php">print_r($_GET);</syntaxhighlight>
<syntaxhighlight lang="php">
print_r($_GET);
</syntaxhighlight>


ergibt mit dem Beispiel von oben
ergibt mit dem Beispiel von oben


{{#tag:pre
<pre><nowiki>
Array
|Array
(
(
[stichwort] => wiki
[stichwort] => wiki
[suchdatum] => 2019-11-27
[suchdatum] => {{#time:Y-m-d}}
)
)}}
</nowiki></pre>


== Nachteile und Probleme ==
== Nachteile und Probleme ==
Zeile 63: Zeile 63:
=== Sicherheitsrisiken ===
=== Sicherheitsrisiken ===


Da der Query-String Teil des URLs ist, ist er für jeden Internetnutzer im [[Browser]] einseh- und auch modifizierbar. In einer Webanwendung sollten demnach nur unkritische Parameter in den Query-String eingefügt werden, etwa die Eingabe in einem Suchfeld.
Da der Query-String Teil des URLs ist, ist er für jeden Internetnutzer im [[Webbrowser|Browser]] einseh- und auch modifizierbar. In einer Webanwendung sollten demnach nur unkritische Parameter in den Query-String eingefügt werden, etwa die Eingabe in einem Suchfeld.


=== Technische Beschränkungen ===
=== Technische Beschränkungen ===


Muss eine größere Menge von Daten übergeben werden, empfiehlt es sich diese nicht über den URL, sondern im [[Hypertext_Transfer_Protocol#Aufbau|Message Body]] mittels der HTTP-Methode [[Hypertext_Transfer_Protocol#HTTP_POST|POST]] zu übermitteln, da für URLs einige Beschränkungen gelten:
Muss eine größere Menge von Daten übergeben werden, empfiehlt es sich diese nicht über den URL, sondern im [[Hypertext Transfer Protocol#Aufbau|Message Body]] mittels der HTTP-Methode [[Hypertext Transfer Protocol#HTTP POST|POST]] zu übermitteln, da für URLs einige Beschränkungen gelten:


* Die HTTP-Spezifikation empfiehlt aus Kompatibilitätsgründen eine Maximalgröße von 255 [[Byte]]s für [[Uniform Resource Locator|URLs]] bzw. [[Uniform Resource Identifier|URIs]].<ref>[http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html HTTP/1.1-Spezifikation]</ref>
* Die HTTP-Spezifikation empfiehlt aus Kompatibilitätsgründen eine Maximalgröße von 255 [[Byte]]s für [[Uniform Resource Locator|URLs]] bzw. [[Uniform Resource Identifier|URIs]].<ref>{{RFC-Internet |RFC=2616 |Titel=HTTP/1.1 |Datum= |Abschnitt=3}}</ref>
* Der [[Internet Explorer]] unterstützt keine URLs, die aus mehr als 2083 Zeichen bestehen.<ref>http://support.microsoft.com/kb/208427</ref>
* Der [[Internet Explorer]] unterstützt keine URLs, die aus mehr als 2083 Zeichen bestehen.<ref>[http://support.microsoft.com/kb/208427 support.microsoft.com]</ref>
* [[Webserver]] können die Maximallänge eines Query-Strings selbst begrenzen. Bei einer Überschreitung dieser Grenze sendet der Server den [[HTTP-Statuscode#4xx – Client-Fehler|HTTP-Statuscode 414]] an den Client zurück.
* [[Webserver]] können die Maximallänge eines Query-Strings selbst begrenzen. Bei einer Überschreitung dieser Grenze sendet der Server den [[HTTP-Statuscode#4xx – Client-Fehler|HTTP-Statuscode 414]] an den Client zurück.
* Die (mittlerweile veraltete) [[Hypertext Markup Language|HTML]]-3-Spezifikation schreibt eine Maximallänge von Linkzielen von 1024 Zeichen vor.<ref>[http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.2 HTML 3-Spezifikation]</ref> Diese Beschränkung ist seit HTML 4 nicht mehr vorhanden.
* Die (mittlerweile veraltete) [[Hypertext Markup Language|HTML]]-3-Spezifikation schreibt eine Maximallänge von Linkzielen von 1024 Zeichen vor.<ref>[http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.2 HTML 3-Spezifikation]</ref> Diese Beschränkung ist seit HTML 4 nicht mehr vorhanden.


== Siehe auch ==
== Siehe auch ==

* [[Clean URL]]
* [[Clean URL]]


== Einzelnachweise ==
== Einzelnachweise ==

<references>
<references>
<ref name="RFC-3986">
<ref name="RFC-3986">{{RFC-Internet |Autor=T. Berners-Lee, R. Fielding, L. Masinter |RFC=3986 |Titel=Uniform Resource Identifier (URI): Generic Syntax |Datum=2005-01 |Abschnitt=3.4 |Abschnittstitel=Query |Standard=66 |Updated=6874, RFC 7320 |Obsoletes=2732, RFC 2396, RFC 1808 |Errata=1 }}</ref>
{{RFC-Internet |Autor=[[Tim Berners-Lee|T. Berners-Lee]], R. Fielding, L. Masinter |RFC=3986 |Titel=Uniform Resource Identifier (URI): Generic Syntax |Datum=2005-01 |Abschnitt=3.4 |Abschnittstitel=Query |Standard=66 |Updated=6874 |Obsoletes=2732 |Errata=1}}
<ref name="W3C-Query-Delimiter">{{Internetquelle |autor= |url=https://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type |titel=17 Forms |titelerg=17.13.4 Form content types |werk=HTML 4.01 Specification |hrsg=[[World Wide Web Consortium]] (W3C) |datum=2018-03-27 |abruf=2019-11-27 |sprache=EN }}</ref>
</ref>

<ref name="W3C-Query-Delimiter">

{{Internetquelle
|url=https://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type
|titel=17 Forms
|titelerg=17.13.4 Form content types
|werk=HTML 4.01 Specification
|hrsg=[[World Wide Web Consortium]] (W3C)
|datum=2018-03-27
|sprache=en
|abruf=2019-11-27}}
</ref>
</references>
</references>



Version vom 12. Juni 2023, 22:39 Uhr

Die Query-Komponente, häufig auch Query-String (englisch für Abfrage-Zeichenkette), ist Teil eines Uniform Resource Locators (URL) im World Wide Web und in RFC 3986 spezifiziert.[1] Die Query-Komponente enthält Daten, häufig in Form von benannten Parametern, die an einen Web-Server gesendet und vom nachgeschalteten Server-Teil einer Webanwendung ausgewertet werden können.

Aufbau

Ein Query-String wird mit einem Fragezeichen (?) eingeleitet und endet mit einem Doppelkreuz (#) oder dem Ende des URLs. Er besteht oft aus einem oder mehreren Parametern, häufig in Form von Schlüssel-Wert-Paaren, die oft mit einem Et-Zeichen (&) voneinander getrennt werden. Parametername und -wert werden durch ein reserviertes Zeichen, meist ein Gleichheitszeichen (=), getrennt. Die genannten Trennzeichen entsprechen der Vorgabe des World Wide Web Consortiums (W3C) für die Übertragung von HTML-Formular-Daten.[2]

Der folgende URL enthält den Query-String stichwort=wiki&ausgabe=liste:

http://www.example.org/suche?stichwort=wiki&ausgabe=liste

Dabei ist dem Parameter stichwort der Wert wiki und dem Parameter ausgabe der Wert liste zugeordnet.

Beispiel

Ein Webformular ist folgendermaßen implementiert:

<form action="suche.php" method="get">
    <label for="stichwort">Suche nach</label>
    <input type="text" name="stichwort" id="stichwort" />
    <input type="hidden" name="suchdatum" value="2025-07-17" />
    <input type="submit" value="Suche starten" />
</form>

Zu beachten ist dabei das verborgene (type="hidden") Feld suchdatum. Es ist im Browser nicht sichtbar, wird beim Absenden des Formulars aber dennoch Teil des Query-Strings. Die Submit-Schaltfläche wird hingegen nicht in den Query-String aufgenommen, da für diese keine Bezeichnung (name) vergeben wurde. Gibt der Benutzer in das Textfeld das Stichwort „wiki“ ein und sendet das Formular ab, wird beispielsweise folgender URL mit dem entsprechenden Query-String stichwort=wiki&suchdatum=2025-07-17 generiert:

http://<server>/suche.php?stichwort=wiki&suchdatum=2025-07-17

Auswertung (in PHP)

In PHP lässt sich der Query-String abfragen. Dabei ist der Inhalt des Query-Strings als Array verfügbar.

echo $_GET['stichwort'];

gibt beispielsweise den Text aus, der in das Suchfeld eingetragen wurde.

print_r($_GET);

ergibt mit dem Beispiel von oben

Array
(
    [stichwort] => wiki
    [suchdatum] => 2025-07-17
)

Nachteile und Probleme

Kodierung

Einige Zeichen dürfen nicht in einem Query-String auftreten, da diese ansonsten fehlerhaft interpretiert werden können. Wird das Gleichheitszeichen beispielsweise innerhalb eines Wertes benutzt, wird dieses fälschlicherweise als Schlüssel-Wert-Trennzeichen erkannt. Beim Generieren des Query-Strings müssen diese Zeichen speziell codiert werden – beispielsweise müsste ein Leerzeichen in ein Pluszeichen (+) umgewandelt werden.

Trennzeichen für Parameter

Das Et-Zeichen (&) als Trennzeichen von Schlüssel-Wert-Paaren ist innerhalb von HTML-Dokumenten problematisch, da dieses Zeichen laut dem World Wide Web Consortium (W3C) speziell kodiert sein muss. Das W3C empfiehlt daher eine Trennung der Paare durch ein Semikolon (;).[3]

Sicherheitsrisiken

Da der Query-String Teil des URLs ist, ist er für jeden Internetnutzer im Browser einseh- und auch modifizierbar. In einer Webanwendung sollten demnach nur unkritische Parameter in den Query-String eingefügt werden, etwa die Eingabe in einem Suchfeld.

Technische Beschränkungen

Muss eine größere Menge von Daten übergeben werden, empfiehlt es sich diese nicht über den URL, sondern im Message Body mittels der HTTP-Methode POST zu übermitteln, da für URLs einige Beschränkungen gelten:

  • Die HTTP-Spezifikation empfiehlt aus Kompatibilitätsgründen eine Maximalgröße von 255 Bytes für URLs bzw. URIs.[4]
  • Der Internet Explorer unterstützt keine URLs, die aus mehr als 2083 Zeichen bestehen.[5]
  • Webserver können die Maximallänge eines Query-Strings selbst begrenzen. Bei einer Überschreitung dieser Grenze sendet der Server den HTTP-Statuscode 414 an den Client zurück.
  • Die (mittlerweile veraltete) HTML-3-Spezifikation schreibt eine Maximallänge von Linkzielen von 1024 Zeichen vor.[6] Diese Beschränkung ist seit HTML 4 nicht mehr vorhanden.

Siehe auch

Einzelnachweise

  1. T. Berners-Lee, R. Fielding, L. Masinter: RFC: 3986 – Uniform Resource Identifier (URI): Generic Syntax [Errata: RFC 3986]. Januar 2005, Abschnitt 3.4: Query. – Standard: [66] (löst RFC 2732 ab, aktualisiert durch RFC 6874, englisch).
  2. 17 Forms. 17.13.4 Form content types. In: HTML 4.01 Specification. World Wide Web Consortium (W3C), 27. März 2018, abgerufen am 27. November 2019 (englisch).
  3. W3C-Empfehlung für das Trennen der Key-Value-Pairs
  4. RFC: 2616 – HTTP/1.1. Abschnitt 3 (englisch).
  5. support.microsoft.com
  6. HTML 3-Spezifikation