【发布时间】:2014-04-26 00:58:34
【问题描述】:
我在 Go 中实现了一个简单的 Web 服务器。由于我没有 Web 开发经验,这对我来说是一个严肃的问题。
假设我正在使用来自 here 的修改后的 loadPage 函数提供网页
func loadPage(title string) []byte {
filename := title
body, _ := ioutil.ReadFile(filename)
return body
}
func handler(w http.ResponseWriter, req *http.Request) {
content := loadPage(req.URL.Path[1:])
fmt.Fprintf(w, "%s", content)
}
从技术上讲,这允许我以
的形式编写请求 http://example.com/../../etc/passwd
并且代码会很高兴地为 /etc/passwd 文件提供服务,但事实并非如此。这是否意味着 Go http 包或 http 协议本身对../ 有某种保护,或者我只是做错了什么并且这是一个安全漏洞?
【问题讨论】:
-
最好使用内置文件服务器:
http://golang.org/pkg/net/http/#FileServer。除了保护您免受您担心的恶意请求之外,它还会提供具有正确 mime 类型的文件。 -
@Anonymous 这只是特定任务的一个例子,我实际上对请求做了很多。