2017-01-16 8 views
0

ウェブアプリケーションの開発は初めてです。私はgolangと一緒に作業しており、ユーザーが自分のファイルのみを表示できるように、ユーザーがアップロードしたファイルを安全に提供したいと考えています。ゴランでファイルを安全に提供するには

ここでは、それらのファイルをランダムな名前のローカルファイルシステムに保存しました。ディレクトリ全体にサービスを提供すると、悪意のあるユーザーが他のユーザーのファイルを表示することがあります。これは一般的なユースケースのように聞こえますが、私はそれに対処する最善の方法は何だろうかと思います。

+0

Webサーバーから直接rawを提供する代わりに、ユーザーが自分のファイルの1つを表示するように確認するルート上に確認レイヤーを追加するだけです。 –

+0

'http.ServeFile()'を使ってファイルを提供することができます。いくつかのコントローラーロジックでは、もちろん –

答えて

2

この質問は、データアクセスを最適化してファイルを保護するために、かなり曖昧でアーキテクチャ上の決定を下す必要があります。

ただし、ここではユースケースに役立つ簡単な解決策があります。

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") 
    } 
} 

ここでは、ファイルのアクセス許可を格納するマップを使用しました。代わりにSQLテーブルを使うことをお勧めします。

+0

この場合、プレフィックスを除去する方法はありますか? – Apophis

0

urファイル名がランダムで長すぎて安全なランダムジェネレータを使用している場合、これは(ディレクトリリストが有効になっていない限り)いくつかの制限がありますが既に安全です。

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

あるユーザーは、彼がランダムな名前のURLを持っている場合にのみ、ファイルへのアクセスを持っています。ただし、URLがブラウザの履歴に保存されるという制限があります。他のユーザーがブラウザの履歴にアクセスした場合、そのURLにアクセスできます。

関連する問題