2017-01-16 6 views
0

Ich bin neu in der Entwicklung von Web-Anwendungen. Ich arbeite mit Golang und möchte die von Nutzern hochgeladenen Dateien sicher bereitstellen, so dass sie nur ihre eigenen Dateien anzeigen können.Wie sichere Sie eine Datei in Golang

Jetzt habe ich diese Dateien in einem lokalen Dateisystem mit zufälligen Namen gespeichert. Wenn ich das gesamte Verzeichnis belege, können böswillige Benutzer andere Benutzerdateien anzeigen. Das klingt wie ein gewöhnlicher Anwendungsfall, ich frage mich, was ist der beste Ansatz, um damit umzugehen?

+0

Anstatt sie direkt vom Webserver direkt bereitzustellen, fügen Sie einfach eine Verifizierungsschicht auf der Route hinzu, die ein Benutzer anfordert, eine seiner Dateien anzuzeigen. –

+0

können Sie 'http.ServeFile()' verwenden, um eine Datei zu liefern. Mit einigen Controller-Logik natürlich –

Antwort

2

Diese Frage in ziemlich vagen und architektonischen Entscheidungen muss getroffen werden, um den Datenzugriff zu optimieren und die Dateien zu sichern.

Hier ist jedoch eine einfache Lösung, die Ihrem Anwendungsfall dienen könnte.

package main 

import (
    "fmt" 
    "mime" 
    "net/http" 
    "path/filepath" 
) 

//UserFilesMap is the map that contains 
var UserFilesMap map[string]FilePermission 

type FilePermission map[string]struct{} 

//FileServer is the function that serves files 
func FileServer(w http.ResponseWriter, r *http.Request) { 
    //get the file path the user wants to access 
    filename := r.URL.Path[9:] 
    var uname, pass string 
    var ok bool 
    if uname, pass, ok = r.BasicAuth(); !ok { 
     w.WriteHeader(http.StatusForbidden) 
     return 
    } 

    if !(uname == "user" && pass == "1234") { 
     w.WriteHeader(http.StatusForbidden) 
     return 
    } 

    //Checking if user has permission to the file 
    if _, ok := UserFilesMap[uname][filename]; !ok { 
     w.WriteHeader(http.StatusForbidden) 
     return 
    } 

    w.Header().Set("Content-Type", mime.TypeByExtension(filepath.Ext(filename))) 
    http.ServeFile(w, r, "files/"+filename) 
} 

func main() { 
    UserFilesMap = make(map[string]FilePermission) 
    // UserFilesMap["user"] = FilePermission{"xyz.txt": struct{}{}} 
    UserFilesMap["user"] = FilePermission{"abc.txt": struct{}{}} 
    http.HandleFunc("/getFile/", FileServer) 
    if err := http.ListenAndServe(":8080", nil); err != nil { 
     fmt.Println("Error in ListenAndServe") 
    } 
} 

Hier verwendete ich eine Karte, um die Berechtigungen von Dateien zu speichern. Ich würde vorschlagen, dass Sie stattdessen für eine SQL-Tabelle gehen.

+0

wie entfernen Sie in diesem Fall Präfix? – Apophis

0

Wenn Ihre Dateinamen zufällig und lang genug sind und einen sicheren Zufallsgenerator verwenden, ist dies bereits sicher (sofern die Verzeichnisliste nicht aktiviert ist) mit einigen Einschränkungen.

https://golang.org/pkg/crypto/rand/

Ein Benutzer Zugriff auf die Datei nur, wenn er die URL mit dem zufälligen Namen hat. Die Einschränkung besteht jedoch darin, dass die URL im Browserverlauf gespeichert wird. Wenn sie jemand anderes findet, hat sie auch Zugriff darauf.

Verwandte Themen