Inhaltsverzeichnis

Datenübertragung per HTTP

Per HTTP kann man Daten auf zwei Arten übertragen:

  1. GET
  2. 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.

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

<?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>";
};

HTML-POST

Daten per POST senden

Shell (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)

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:

<?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);
?>

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

<?php
echo $_POST["Inhalt"];
?>

GET- und POST-Test-Script

#!/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>
'