Go是否清理Web请求的URL?

我在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确保它是这样的,如果没有已经存在的话,则通过在要清理的路径前加上一个正斜杠.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些