gpt4 book ai didi

go - 你如何在 golang 中安全地提供文件

转载 作者:IT王子 更新时间:2023-10-29 02:32:51 24 4
gpt4 key购买 nike

我是开发网络应用程序的新手。我正在使用 golang 并希望安全地为用户上传的文件提供服务,例如只允许他们查看自己的文件。

现在我已将这些文件以随机名称保存到本地文件系统。如果我提供整个目录,恶意用户可能会查看其他用户的文件。这听起来像是一个常见的用例,我想知道处理它的最佳方法是什么?

最佳答案

这个问题非常模糊,必须做出架构决策以优化数据访问和保护文件。

但是,这里有一个可能适合您的用例的简单解决方案。

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

这里,我使用了一个map来存储文件的权限。我建议您改用 SQL 表。

关于go - 你如何在 golang 中安全地提供文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41683952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com