2009-12-11 13 views
7

Je travaille sur une page qui accepte les téléchargements de fichiers. En théorie, je peux détecter quand le fichier qu'ils m'envoient est trop gros (en regardant le Content-Length de leur réponse), et refuser d'accepter le téléchargement, renvoyant un HTTP 413 "Request Entity Too Large" Erreur.Comment puis-je limiter la taille des requêtes HTTP POST dans mod_perl?

Cependant, il semble que le simple fait cela ne suffit pas - Firefox, à moins , gardera toujours l'envoi du reste du fichier (qui pourrait prendre beaucoup de temps ), avant qu'il ne montre ma page d'erreur.

Le HTTP spec dit que je: "PEUT fermer la connexion pour empêcher le client de continuer la demande." Cependant, faire un 'STDIN proche', 'shutdown STDIN, 0', ou une variante de cela ne semble pas faire l'astuce - Firefox continue d'envoyer le fichier.

Je soupçonne que, lorsque mon gestionnaire mod_perl ferme la connexion, il est simplement fermer la connexion entre lui-même et Apache; Apache maintient la connexion entre lui et le client vivant. Est-il possible de dire à Apache de fermer la connexion? Sinon, cela ressemble à un grand vecteur de DoS .

Toutes les suggestions seraient les bienvenues.

+0

Vous pourriez également vouloir penser à la demande en cours de fragmentation, et ainsi vous ne connaîtrez pas la taille du corps de la demande jusqu'à ce que tous les morceaux soient arrivés ... –

Répondre

6

Avez-vous exploré les capacités de limitation d'Apache (par opposition à celles de Perl)? Je ne sais pas en détails comment la directive LimitRequestBody traite les demandes qui sont trop volumineuses, mais au moins en théorie cela ressemble à un paramètre conçu pour bloquer les attaques.

1

Oui, peu importe ce que Perl fait avec STDIN ou STDOUT, Apache permettra toujours le téléchargement de procéder avant même qu'il vérifie ce qui se passe avec votre CGI. Vous pouvez fermer STDIN ou STDOUT ou même exit() (bien que vous ne puissiez pas le faire puisque votre processus est persistant), mais rien de tout cela n'aura d'effet jusqu'à ce que après Apache accepte la requête POST dans son intégralité. De même avec tout type d'en-têtes de statut que vous pourriez générer, comme un 413 pour "Demande trop grande". Par conséquent, Apache doit refuser les requêtes POST au-delà d'une certaine taille pour que cela fonctionne, par exemple en utilisant LimitRequestBody comme suggested by Pekka.

+0

mod_cgi et mod_perl sont différents modules. –

+0

@Alexandr: Oui ...? Je suis désolé, je ne suis pas. –

+0

Je pense que ce qu'il voulait dire, c'est que dans mod_perl, vous pouvez avoir un feu de gestionnaire AVANT que le message soit terminé. Cela vous permet d'annuler la publication pendant qu'elle est en cours plutôt que d'attendre que le téléchargement soit terminé. – Rahly