是否对web请求的URL进行清理?

是否对web请求的URL进行清理?,web,go,Web,Go,我在Go中实现了一个简单的web服务器。由于我在web开发方面没有经验,这对我来说是一个严重的问题 比如说,我正在使用来自的修改后的loadPage函数为网页提供服务 从技术上讲,这允许我以 http://example.com/../../etc/passwd 代码很乐意为/etc/passwd文件提供服务,但事实并非如此。这是否意味着在Go http包或http协议本身中存在某种针对。/的保护,或者我只是做错了什么,这是一个安全漏洞 net/http在其http请求多路复用器中执行此操作

我在Go中实现了一个简单的web服务器。由于我在web开发方面没有经验,这对我来说是一个严重的问题

比如说,我正在使用来自的修改后的
loadPage
函数为网页提供服务

从技术上讲,这允许我以

 http://example.com/../../etc/passwd

代码很乐意为/etc/passwd文件提供服务,但事实并非如此。这是否意味着在Go http包或http协议本身中存在某种针对
。/
的保护,或者我只是做错了什么,这是一个安全漏洞

net/http
在其http请求多路复用器中执行此操作:

ServeMux还负责清理URL请求路径,重定向包含URL的任何请求。或元素转换为等效的-和..-免费URL

相关函数是private func
cleanPath(p字符串)字符串
,它:

路径清理:


如果路径不是根路径,则会出现另一种情况,但上面的
cleanPath
会确保它是根路径,如果路径还没有根路径,则在要清理的路径前面加一个正斜杠。

最好使用内置文件服务器:
http://golang.org/pkg/net/http/#FileServer
。除了保护您免受您担心的恶意请求之外,它还将为文件提供正确的mime类型。@匿名这只是特定任务的一个示例,我实际上在请求方面做了很多工作。
 http://example.com/../../etc/passwd
1415        np := path.Clean(p)
 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                 }