2010-10-25 5 views
14

Nous souhaitons limiter la taille maximale du fichier de téléchargement sur notre site Web. Nous avons déjà défini les limites appropriées dans notre web.config. Le problème que nous rencontrons est si un vraiment grand fichier (1 Go, par exemple) est téléchargé, le fichier entier est téléchargé avant qu'une erreur côté serveur est générée, et le type de l'erreur est différente si le le fichier est énorme ou pas.Prévention du téléchargement de fichiers volumineux dans ASP.NET 4.0

Existe-t-il un moyen de détecter la taille d'un téléchargement de fichier en attente avant que le téléchargement réel ait lieu?

Voilà mes paramètres web.config pertinents qui limitent les demandes à 16 Mo:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
     <httpRuntime maxRequestLength="12288"/> 
    </system.web> 

    <system.webServer> 
     <security> 
      <requestFiltering> 
       <requestLimits maxAllowedContentLength="12582912"/> 
      </requestFiltering> 
     </security> 
    </system.webServer> 
</configuration> 

J'ai essayé de créer un module HTTP afin que je puisse intercepter une demande au début du cycle de vie de la demande, mais les ajouts semblent lieu avant même l'événement BeginRequest de HttpApplication:

public class UploadModule : IHttpModule 
{ 
    private const int MaxUploadSize = 12582912; 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += handleBeginRequest; 
    } 

    public void Dispose() 
    { 
    } 

    private void handleBeginRequest(object sender, EventArgs e) 
    { 
     // The upload takes place before this method gets called. 

     var app = sender as HttpApplication; 

     if (app.Request.Files.OfType<HttpPostedFile>() 
      .Any(f => f.ContentLength > MaxUploadSize)) 
     { 
      app.Response.StatusCode = 413; 
      app.Response.StatusDescription = "Request Entity Too Large"; 
      app.Response.End(); 
      app.CompleteRequest(); 
     } 
    } 
} 

Mise à jour:

Je sais que les technologies côté client comme Flash peuvent détecter les tailles de fichiers avant le téléchargement, mais nous avons besoin d'une solution de contournement côté serveur car nous voulons cibler les plates-formes qui ne supportent pas Flash/Java/ActiveX/Silverlight. Je crois que IIS ou ASP.NET a un bug qui permet de télécharger des fichiers volumineux malgré les limites, donc j'ai déposé un bug here. Une extension ISAPI me donnerait-elle plus de contrôle sur le traitement des requêtes que les modules et les gestionnaires HTTP, par exemple si je pouvais interrompre un téléchargement si l'en-tête Content-Length dépassait la limite autorisée?

Mise à jour 2:

Soupir. Microsoft a fermé le bug que j'ai déposé en tant que doublon, mais n'a fourni aucune information supplémentaire. J'espère qu'ils n'ont pas simplement laissé tomber la balle à ce sujet.

Mise à jour 3:

Hourra! Selon Microsoft:

Ce bogue est en cours de résolution car il a été porté à l'équipe de produit IIS. L'équipe IIS a depuis corrigé le bogue, qui sera inclus dans la future version de Windows.

+0

+1 sur la question; intéressé par ce sujet moi-même. D'après ce que je comprends, vous ne pouvez rien faire avant que toute la demande ne soit présentée, et le code que vous essayez d'utiliser n'a certainement aucun moyen de savoir à l'avance. Je pense qu'il faudrait quelque chose plus tôt dans le pipeline de demandes; comme dans le client, ou avant IIS/ASP.NET reçoit la demande - que la demande commence à diffuser. –

+0

peut être vous pouvez vous référer à cela: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatically/14033087 # 14033087 –

Répondre

2

Microsoft a responded on their Microsoft Connect site ce qui suit:

Ce bug est en voie de résolution car il a été porté à l'équipe de produits IIS. L'équipe IIS a depuis corrigé le bogue, qui sera inclus dans la future version de Windows.

Si vous demandez un correctif pour le système d'exploitation actuel, une demande QFE doit être ouverte. S'il vous plaît laissez-moi savoir si c'est le chemin que vous voulez prendre. Veuillez noter que l'ouverture d'une demande QFE ne signifie pas nécessairement qu'elle serait approuvée.

Je suppose que nous devons attendre la prochaine version de IIS pour le correctif (à moins qu'une demande de QFE est remplie, quelle que soit que est).

2

est-il un moyen de détecter la taille d'un téléchargement de fichiers en attente avant le téléchargement réel a lieu?

Non. Cela nécessite l'accès à la taille de fichier sur le client. Permettre à un serveur web d'accéder directement aux fichiers sur le client serait un peu dangereux.

Votre meilleur pari est de placer une ligne de texte indiquant la taille maximale autorisée du fichier. OU vous pouvez créer un contrôle ActiveX, un applet java, etc. pour ne pas dépendre des restrictions du navigateur.Ensuite, vous devez convaincre vos utilisateurs de l'installer. Probablement pas la meilleure solution.

+1

correct. mais il devrait y avoir un moyen de détecter la taille du fichier téléchargé avant que le fichier entier ne soit téléchargé côté serveur: nous pouvons lire l'en-tête "Content-Length" juste après réception et analyse de l'en-tête de la requête). Je vais mettre à jour cela plus tard. –

+0

Ici: http://stackoverflow.com/questions/14032918/setting-maxrequestlength-programmatically/14033087#14033087 –

2

Le problème est que le téléchargement se produit en une seule fois à l'aide de la requête HTTP Post. Vous ne pouvez donc le détecter qu'après l'avoir fait.

Si vous voulez plus de contrôle sur cela, vous devriez essayer les widgets de téléchargement basés sur Flash qui ont ceci et plus encore. Consultez ce lien http://www.ajaxline.com/10-most-interesting-upload-widgets

+1

Vous donnez l'impression que c'est une limitation fondamentale dans HTTP, où c'est vraiment une limitation dans le logiciel de serveur Web. – Charlie

0

Bien .... Cela dépend du niveau que vous voulez obtenir.

Créez une application de service qui agit comme un proxy pour IIS. (Toutes les demandes de socket du port 80 entrant vont au service.) Demandez au service de transmettre tout ce qu'il reçoit à IIS (écoute de site web sur un port ou IP différent), mais surveillez la taille totale de la requête telle qu'elle est reçue. Lorsque la taille d'une connexion donnée dépasse la limite souhaitée, fermez la connexion. Renvoyez une redirection vers une page d'erreur si vous voulez être poli.

Idiot, mais il vous permettra de surveiller les données en transit sans attendre que IIS ne passe la main.

Questions connexes