Über das Common Gateway Interface sind Daten an STDIN nicht nur bei einem POST zu erwarten
Bei einem HTTP-Request
mit der Methode POST
sind Daten in STDIN
zu erwarten, so beschreiben es viele Tutorials zu diesem Thema. Für ein File-Upload wird ebenfalls die Request-Method POST
verwendet. Und sicher besteht der Wunsch, die Uploadmenge irgendwo begrenzen zu wollen. Aber reicht es denn, sich auf die Request-Method POST
zu beschränken und auf den mit einem Upload verbundenen Content-Type: multipart/form-data
? Weit gefehlt!
ist für viele der Inbegriff zur Programmierung von CGI
-Scripts schlechthin. CGI
, das heißt: Common Gateway Interface
und was das technisch bedeutet, ist vielen Anwendungsentwicklern gar nicht so klar. So einfach, wie der Umgang mit Request-Parametern via CGI.pm
erscheinen mag, so begrenzt sind auch die Möglichkeiten mit diesem Perl-Modul. Neben Request-Method POST
gibt es nämlich unendlich viele andere Request-Methoden und per CGI
-Definition liegen nicht nur bei einem POST
die Daten an STDIN
an. Eben das kann genausogut bei einem GET
der Fall sein, genauso wie bei einem PUT
oder eben bei einer der unendlich vielen anderen Request-Methoden. Die nämlich können frei benannt werden!
Es ist nur so, dass in einschlägigen RFCs nur POST
oder PUT
für's Senden großer Datenmengen beschrieben sind und HTTP-Clients
nichts anderes erlauben. Aber wenn irgendwas nicht erlaubt ist, heißt das noch lange nicht, dass das nicht funktioniert!
Ein HTTP
Client sendet Daten via Socket
. Dahinein wird z.B. untenstehender String geschoben, gucken Sie mal:
GET /index.html HTTP/1.0 Host: example.com Content-Length: 10 Hallo Welt
Merke: Entscheidend ist nicht die Request-Methode GET
sondern der Request-Header Content-Length
. Das bedeutet serverseitig, dass in diesem Fall genau 10 Bytes an STDIN
zu erwarten sind. Anhand des gesendeten Content-Length-Headers
setzt der Webserver eine CGI-Umgebungsvariable CONTENT_LENGTH
bzw $ENV{CONTENT_LENGTH}
(Perl).
Und jetzt kommt der eigentliche Hack: Ein CGI
-Script kann anhand der Umgebungs-Variable CONTENT_LENGTH
entscheiden, ob es die Daten aus STDIN
annehmen mag oder nicht. Notieren Sie möglichst weit oben:
die "Das ist zuviel!\n" if $ENV{CONTENT_LENGTH} && $ENV{CONTENT_LENGTH} > 10_000_000;
Wobei die Exception natürlich aufgefangen werden sollte, damit der Webserver keinen Internal Server Error mit Status 500
sendet. Es sei denn, das ist so gewünscht.
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de.