【问题标题】:Does Go sanitize URLs for web requests?Go 会清理 Web 请求的 URL 吗?
【发布时间】:2014-04-26 00:58:34
【问题描述】:

我在 Go 中实现了一个简单的 Web 服务器。由于我没有 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 协议本身对../ 有某种保护,或者我只是做错了什么并且这是一个安全漏洞?

【问题讨论】:

  • 最好使用内置文件服务器:http://golang.org/pkg/net/http/#FileServer。除了保护您免受您担心的恶意请求之外,它还会提供具有正确 mime 类型的文件。
  • @Anonymous 这只是特定任务的一个例子,我实际上对请求做了很多。

标签: web go


【解决方案1】:

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

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

相关函数是私有函数cleanPath(p string) string,其中calls path.Clean

1415        np := path.Clean(p)

path.Cleandoes 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 确保它是这样的,如果路径还没有,则在要清理的路径前添加一个正斜杠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2011-10-29
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多