2016-09-16 3 views
0

ich zur Zeit auf eine ‚Download-Datei‘ Implementierung arbeite, die NICHT gespeichert heruntergeladen werden können in der Datenbank sind, I Ich gebe den vollständigen Dateipfad als Parameter für die Identifizierung ein.Zulassen vollständigen Dateipfad in URI für Web-API-Aufruf

Es scheint das Problem mit diesem Ansatz ist, dass der Dateipfad Zeichen enthält, die für einen URI ungültig sind ... Hat jemand Vorschläge, um diese oder einen alternativen Ansatz zu lösen?

Datei herunterladen Methode:

[HttpGet] 
    [Route("Files/{*filePath}")] 
    public HttpResponseMessage Get([FromUri]string filePath) 
    { 
     try 
     { 
      var file = new FileInfo(filePath); 

      byte[] bytes = System.IO.File.ReadAllBytes(filePath); 

      var result = Request.CreateResponse(HttpStatusCode.OK); 

      result.Content = new ByteArrayContent(bytes); 
      result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      result.Content.Headers.ContentDisposition.FileName = file.Name + file.Extension; 

      return result; 

     } 
     catch(Exception ex) 
     { 
      return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); 
     } 
    } 

Antwort

0

den Client Erfordern den vollständigen Pfad in der URI zu setzen (auch wenn es verschlüsselt wurden, so dass sie nur gültige Zeichen für den URI enthält) bedeutet, dass Sie sein können Veröffentlichung dieser irgendwo Pfade ... ist dies nicht eine gute Idee für ein paar Gründe:

  1. Sicherheit - full Path Disclosure und die damit verbundenen Relative Path Traversal
    1. d. H. Was zu verhindern ist, dass jemand den Pfad zu einer empfindlichen Datei (z.B. Ihre Datei web.config) und möglicherweise Informationen erhalten, die Ihnen beim Angriff auf Ihr System helfen könnten?
  2. Wartbarkeit
    1. Clients zur Wiederverwendung oder Verteilung eine Kopie einer URI halten kann - was passiert, wenn die Dateipfade ändern? Einige verwandte Gespräch zu diesem Thema hier: Cool URIs don't change

Mein Vorschlag - Sie müssen nicht die Dateien setzen sich in einer Datenbank, sondern eine Liste von Dateien in einer Datenbank setzen, und verwenden Sie eine eindeutige Kennung in der URL (zB eine slug oder GUID). Suchen Sie in der Datenbank nach dem Bezeichner, um den Pfad zu ermitteln, und geben Sie dann diese Datei zurück.

Dies stellt sicher:

  1. niemand eine Datei lesen, dass Sie nicht indiziert sind und bestimmt ist sicher heruntergeladen werden
  2. Wenn Sie die Dateien verschieben können Sie die Datenbank und Client-URIs aktualisieren wird sich nicht ändern
  3. Und auf Ihre ursprüngliche Frage zu beantworten, können Sie die eindeutige Kennung leicht gewährleisten können, ist nur aus URI sicheren Zeichen gemacht

Sobald Sie die Datenbank haben, können Sie im Laufe der Zeit kann es auch nützlich sein, andere Metadaten in der Datenbank zu pflegen, wie wer die Datei hochgeladen hat, wann, wer es heruntergeladen hat, und wann usw.

+0

Danke für die ausführliche Antwort, Chris! Einige sehr gute/nützliche Punkte, die Sie dort vorgestellt haben. Ein Problem mit Ihrem Vorschlag besteht darin, die Datenbank auf dem neuesten Stand zu halten ... Wenn neue Dateien zum Quellordner hinzugefügt, verschoben oder gelöscht werden, muss die Datenbank manuell aktualisiert werden ... – Tomuke

+0

Abhängig von der Art und Menge der API Kunden, die eine gute Sache sein könnten - z Wenn Sie 50 API-Clients haben und eine Datei verschoben haben, möchten Sie lieber 50 Clients oder einen Datenbankeintrag aktualisieren?Wenn Sie Ihre Frage mit mehr Informationen über die Client-Server-Beziehung aktualisieren können (wie viele Clients, wie erhalten sie Wissen, welchen Pfad Sie in die API-URI eingeben sollen usw.), wäre es hilfreich, eine bessere Antwort zu präsentieren. –

Verwandte Themen