我在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协议本身中存在某种针对../的保护,或者我只是做错了什么并且它是一个安全漏洞?
解决方法
net / http在其HTTP请求多路复用器
ServeMux
中执行此操作:
ServeMux also takes care of sanitizing the URL request path,redirecting any request containing . or .. elements to an equivalent .- and ..-free URL.
相关函数是private func cleanPath(p 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 }
如果路径没有root,则还有一个例子,但上面的cleanPath确保它是这样的,如果没有已经存在的话,则通过在要清理的路径前加上一个正斜杠.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。