2016-11-21 9 views
0

でフォルダ内のファイルへのアクセスを防止:私はそのようなフォルダパスを扱うgolangでサーバましgolangサーバ

fs := http.FileServer(http.Dir("./assets")) 
http.Handle("/Images/", fs) 
http.ListenAndServe(":8000", nil) 

をしかし、このフォルダ内にあり陰部の画像があり、それが可能であるべきではありませんファイルにアクセスする。どのようにして画像のアクセスを保護し、誰かがフォルダのコンテンツにアクセスするのを防ぐことができます。

例えばそのような

enter image description here

+0

を言っているに従うことを願って? – xen

+0

@xenフォルダパス – Fantasim

+0

でこのフォルダにファイルにアクセスしたくないのですがこれは問題ですか? https://groups.google.com/forum/#!topic/golang-nuts/bStLPdIVM6w – lofcek

答えて

1

あなたがhttpパッケージを使用してディレクトリをブロックしたい場合は、多分これはあなたに有用であろう:

https://groups.google.com/forum/#!topic/golang-nuts/bStLPdIVM6w

package main 

import (
    "net/http" 
    "os" 
) 

type justFilesFilesystem struct { 
    fs http.FileSystem 
} 

func (fs justFilesFilesystem) Open(name string) (http.File, error) { 
    f, err := fs.fs.Open(name) 
    if err != nil { 
     return nil, err 
    } 
    return neuteredReaddirFile{f}, nil 
} 

type neuteredReaddirFile struct { 
    http.File 
} 

func (f neuteredReaddirFile) Readdir(count int) ([]os.FileInfo, error) { 
    return nil, nil 
} 

func main() { 
    fs := justFilesFilesystem{http.Dir("/tmp/")} 
    http.ListenAndServe(":8080", http.FileServer(fs)) 
} 
+0

この行で何をすればよいですか:fs:= http.FileServer(http.Dir( "./ assets"))? ? – Fantasim

+1

'http.Dir("/tmp/")'を 'http.Dir(" ./ assets ")'に置き換えなければならないと思います。 –

+0

これは完璧に動作しますが、このサーバ上の私のAPIはもはや動作しません。 2台のサーバーを作る? – Fantasim

1

FileServer()上の小さなラッパーはあなたの問題を解決します。今度は、認可を行うためのロジックを追加する必要があります。一意の名前を持つように見えるので、名前のマップを作成するだけでイメージ名をフィルタリングし、キー/ストア(memcached、redis)のようにもっと動的なものを追加することができます。など)あなたは、あなたは、人々が同じフォルダにこれらのイメージが、他のファイルにアクセスする必要はありませんコメント

package main 

import (
    "log" 
    "net/http" 
    "strings" 
) 

// put the allowed hashs or keys here 
// you may consider put them in a key/value store 
// 
var allowedImages = map[string]bool{ 
    "key-abc.jpg": true, 
    "key-123.jpg": true, 
} 

func main() { 

    http.Handle("/Images/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 

     // here we can do any kind of checking, in this case we'll just split the url and 
     // check if the image name is in the allowedImages map, we can check in a DB or something 
     // 
     parts := strings.Split(r.URL.Path, "/") 
     imgName := parts[len(parts)-1] 

     if _, contains := allowedImages[imgName]; !contains { // if the map contains the image name 

      log.Printf("Not found image: %q path: %s\n", imgName, r.URL.Path) 

      // if the image is not found we write a 404 
      // 
      // Bonus: we don't list the directory, so nobody can know what's inside :) 
      // 
      http.NotFound(w, r) 
      return 
     } 

     log.Printf("Serving allowed image: %q\n", imgName) 

     fileServer := http.StripPrefix("/Images/", http.FileServer(http.Dir("./assets"))) 

     fileServer.ServeHTTP(w, r) // StripPrefix() and FileServer() return a Handler that implements ServerHTTP() 
    })) 

    http.ListenAndServe(":8000", nil) 
} 

https://play.golang.org/p/ehrd_AWXim

+0

それは私が知っている必要があります正確にはありませんが、ありがとう、私は確かに、この例が必要です:) – Fantasim

関連する問題