2016-04-29 8 views
2

Eine der Sicherheitsmaßnahmen in meinem Webservice ist das Blockieren großer Datei-Uploads.
Ich möchte eine Datei-Upload-Anfrage so schnell wie möglich abbrechen, wenn zu große Dateien gesendet werden.Frühester Zeitpunkt, um die POST-Anfrage im Webservice abzubrechen?

Da die Anfragen mit der Datei-Uploads sowieso die größten sein werden, ich habe zur Zeit diesen Code in dem BeforeDispatch Handler der TWebModule:

procedure TWebModuleWebServices.WebModuleBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    // Request that are too large are going to be dropped silently: 
    if Request.ContentLength > cMaxContentSize then 
    begin 
     Handled := true; 
     Exit; 
    end; 

Ist der Before Handler zum frühestmöglichen Zeitpunkt für Dieser Test, oder gibt es einen besseren Ort?

Der Webservice ist um einen TIdHTTPWebBrokerBridge gebaut (= class(TIdCustomHTTPServer) finden IdHTTPWebBrokerBridge.pas)

Antwort

1

Mit Indy, TCustomWebDispatcher.BeforeDispatch Ereignis ist zu spät, da die Post-Datenstrom bereits in TIdCustomHttpServer.DoExecute abgerufen wurden. Sie können das Ereignis TIdCustomHTTPServer.OnHeadersAvailable verwenden, das früher ausgelöst wurde, um dies zu vermeiden, indem Sie VContinueProcessing auf False setzen.

+1

Wenn 'OnHeadersAvailable'' VContinue = False' setzt, können Sie das Ereignis 'TIdCustomHTTPServer.OnHeadersBlocked' verwenden, um die Antwort anzupassen, die an den Client zurückgesendet wird. Standardmäßig wird eine '403 Forbidden' Antwort gesendet. In diesem Fall wäre '413 Payload Too Large' angemessener. –

Verwandte Themen