====== Datenübertragung per HTTP ======
Per HTTP kann man Daten auf zwei Arten übertragen:
- GET
- POST
Die Mthode //GET// hat den Vorteil, das sie recht simpel ist aber den Nachteil, das man mit ihr nur maximal 255 Zeichen übertragen kann.
Es ist auch zu bedenken, das //GET// seine Daten selbst bei HTTPS nicht verschlüsselt überträgt, da es ja eigentlich Bestandteil der URL ist und nicht Bestandteil des eigentlichen Datenstromes. Aus dieser Sicht herraus kann man eine Datenübertragung per //GET// auch als "dirty-hack" bezeichnen.
Die Methode //POST// hat den Vorteil, das man mit ihr theoretisch eine unendliche Menge Daten übertragen kann aber den Nachteil, das sie nicht besonders einfach ist.
* [[http://www.cgi101.com/book/ch3/text.html|CGI Environment Variables]]
* [[http://www.comptechdoc.org/independent/web/cgi/cgimanual/cgivars.html|CGI Variables]]
Im Folgenden stelle ich für jede Methode ein Beispiel vor.
===== HTML-GET =====
==== Daten per GET senden ====
http://server.de/pfad/seite.html?Variable1=Wert1&Variable2=Wert2&Variable3=Wert3&Variable4=Wert4
Wie man sieht, werden die Daten einfach an die URL durch ein "?" angehängt und die einzelnen Werte durch "&" getrennt.
Leerzeichen dürfen in einer GET-Anweisung **nicht** auftauchen, sie werden durch "+" ersetzt!
==== per GET empfangene Daten verarbeiten ====
=== SHELL/CGI (Apache/Shell) ===
vi cgi-bin/postempfang.cgi
echo "${QUERY_STRING}"
=== PHP/CGI (PHP5) ===
Hier werden die empfangenen Daten per PHP weiter verarbeitet:
vi cgi-bin/postempfang.php
oder
alle werden so ausgelesen:
$value) {
echo $key."=".$value."
";
};
?>
ein Array wird so ausgelesen (das Array heißt hier "identifier[]"):
foreach ($_GET["identifier"] as $key => $value) {
echo $key."=".$value."
";
};
===== HTML-POST =====
==== Daten per POST senden ====
=== Shell (wget) ===
[[http://www.gnu.org/software/wget/|wget]] ist ein tolles Werkzeug!
Einen String senden:
# wget --post-data='String zum senden oder sowas key1=value1&key2=value2' http://www.domain.net/post.cgi
Eine Datei senden:
# wget --post-file=datei.txt --referer=http://www.domain.net/post.cgi http://www.domain.net/post.cgi
--2010-06-29 14:47:56-- http://www.domain.net/post.cgi
Verbindungsaufbau zu www.domain.net:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 500 Internal Server Error
2010-06-29 14:47:56 FEHLER 500: Internal Server Error.
Wie man sieht, kann //wget// auch den REFERER simulieren.
Es kommt hier zwar zu einer Fehlermeldung, aber die POST-Daten sind auf dem Server angekommen (und das ganz ohne PHP).
=== Shell (cURL) ===
[[http://curl.haxx.se|curl]] ist ein tolles Werkzeug!
Einen String senden:
# curl -d “String zum senden oder sowas key1=value1&key2=value2” “http://www.domain.net/post.cgi”
Eine Datei senden:
# curl -d @datei.txt “http://www.domain.net/post.cgi”
Diese Möglichkeit habe ich nicht getestet.
=== PHP (PHP5) ===
Mit dieser PHP-Funktion kann man eine große Datenmenge per //POST// an einen Webserver übertragen:
==== Daten per POST empfangen ====
=== SHELL/CGI (Apache/Shell) ===
Die Daten der //POST//-Methode werden von StdIn gelesen:
vi cgi-bin/postempfang.cgi
DATEN="$(dd bs=1 count=${CONTENT_LENGTH} 2> /dev/null)"
echo "${DATEN}"
=== PHP/CGI (PHP5) ===
Hier werden die Daten in Empfang genommen:
vi cgi-bin/postempfang.php
===== GET- und POST-Test-Script =====
#!/bin/bash
echo 'Content-type: text/html