Perl $CGI::POST_MAX und File Upload

Ü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!

Das Perl Modul CGI.pm

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!

Die CGI-Umgebungsvariable CONTENT_LENGTH

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. s​os­@rolf­rost.de.