我在Go中实现了一个简单的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协议本身中存在某种针对../
的保护,或者我只是做错了什么并且它是一个安全漏洞?
答案 0 :(得分:7)
net/http
在其HTTP请求多路复用器ServeMux
中执行此操作:
ServeMux还负责清理URL请求路径,重定向包含的任何请求。或..元素到等效的.-和..-免费URL。
相关功能是私人功能cleanPath(p string) string
,calls path.Clean
:
1415 np := path.Clean(p)
path.Clean
does the appropriate removals:
97 case path[r] == '.' && path[r+1] == '.' && (r+2 == n || path[r+2] == '/'):
98 // .. element: remove to last /
99 r += 2
100 switch {
101 case out.w > dotdot:
102 // can backtrack
103 out.w--
104 for out.w > dotdot && out.index(out.w) != '/' {
105 out.w--
106 }
如果路径没有根据,还有一个额外的情况,但上面的cleanPath
确保它是这样的,如果没有&#39则通过在要清理的路径前加一个正斜杠。已经存在了。