Per HTTP kann man Daten auf zwei Arten übertragen:
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.
Im Folgenden stelle ich für jede Methode ein Beispiel vor.
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!
vi cgi-bin/postempfang.cgi
echo "${QUERY_STRING}"
Hier werden die empfangenen Daten per PHP weiter verarbeitet:
vi cgi-bin/postempfang.php
<?php echo $_GET["Variable1"]; echo $_GET["Variable2"]; echo $_GET["Variable3"]; echo $_GET["Variable4"]; ?>
oder
<?php echo $_REQUEST["Variable1"]; echo $_REQUEST["Variable2"]; echo $_REQUEST["Variable3"]; echo $_REQUEST["Variable4"]; ?>
alle werden so ausgelesen:
<?php
foreach ($_GET as $key => $value) {
echo $key."=".$value."<BR>";
};
?>
ein Array wird so ausgelesen (das Array heißt hier "identifier[]"):
foreach ($_GET["identifier"] as $key => $value) {
echo $key."=".$value."<BR>";
};
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).
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.
Mit dieser PHP-Funktion kann man eine große Datenmenge per POST an einen Webserver übertragen:
<?php
...
#==============================================================================#
# PHP-Funktion-Funktion: Beginn
#------------------------------------------------------------------------------#
#
function PostToHost($host, $path, $referer, $data_to_send)
{
$buf = "";
$fp = fsockopen($host, 80);
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data_to_send) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data_to_send);
while(!feof($fp))
{
$buf .= fgets($fp, 128);
}
fclose($fp);
return $buf;
}
#
#------------------------------------------------------------------------------#
# PHP-Funktion-Funktion: Ende
#==============================================================================#
...
#$daten = urlencode("Das ist ein Test");
$daten = "Das ist ein Test";
PostToHost(
"192.168.1.1",
"/cgi-bin/postempfang.cgi",
"http://192.168.1.1/cgi-bin/postempfang.cgi",
$daten);
?>
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}"
Hier werden die Daten in Empfang genommen:
vi cgi-bin/postempfang.php
<?php echo $_POST["Inhalt"]; ?>
#!/bin/bash
echo 'Content-type: text/html
<H1>GET- und POST-Test</H1>
'
echo "<BR>------------------------------------------------------------------------------<BR>"
echo "<BR><B><U>GET-Daten:</U></B><BR>"
echo "${QUERY_STRING}" 2> /dev/null | tr -d '"' | awk '{print tolower($0)}' | sed -e 's/%5b/\[/g' -e 's/%5d/\]/g' -e 's#\&#<BR>#g' #> /tmp/get.txt 2>&1
echo "<BR>------------------------------------------------------------------------------<BR>"
echo "<BR><B><U>POST-Daten:</U></B><BR>"
echo "$(dd bs=1 count=${CONTENT_LENGTH} 2> /dev/null | tr -s '&' '\n')" | tr -d '"' | awk '{print tolower($0)}' | sed -e 's#%3a#:#g' #> /tmp/post.txt 2>&1
echo "<BR>------------------------------------------------------------------------------<BR>"
echo '
</div>
</body>
</html>
'