是否对web请求的URL进行清理?
我在Go中实现了一个简单的web服务器。由于我在web开发方面没有经验,这对我来说是一个严重的问题 比如说,我正在使用来自的修改后的是否对web请求的URL进行清理?,web,go,Web,Go,我在Go中实现了一个简单的web服务器。由于我在web开发方面没有经验,这对我来说是一个严重的问题 比如说,我正在使用来自的修改后的loadPage函数为网页提供服务 从技术上讲,这允许我以 http://example.com/../../etc/passwd 代码很乐意为/etc/passwd文件提供服务,但事实并非如此。这是否意味着在Go http包或http协议本身中存在某种针对。/的保护,或者我只是做错了什么,这是一个安全漏洞 net/http在其http请求多路复用器中执行此操作
loadPage
函数为网页提供服务
从技术上讲,这允许我以
http://example.com/../../etc/passwd
代码很乐意为/etc/passwd文件提供服务,但事实并非如此。这是否意味着在Go http包或http协议本身中存在某种针对
。/
的保护,或者我只是做错了什么,这是一个安全漏洞 net/http
在其http请求多路复用器中执行此操作:
ServeMux还负责清理URL请求路径,重定向包含URL的任何请求。或元素转换为等效的-和..-免费URL
相关函数是private funccleanPath(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 }