Golang遇到问题,求助大神解答

Golang遇到问题,求助大神解答 我发现以下代码按预期工作:

http.HandleFunc("/@",startHandler)

然而,如果我将 ‘@’ 替换为 ‘#’,我会得到服务器账户的目录列表。

我认为这可能是一个安全问题。

毫无疑问,这对某些人来说非常有用。

6 回复

也许曾有中情局或摩萨德的人员为开源社区做出过贡献。

更多关于Golang遇到问题,求助大神解答的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我宁愿不测试代码或点击 https://xxxxxxxxxxxx.com 链接进行重定向。指向 localhost:PORT/@ 怎么样?

你可以使用 path 包来实现简单的路径匹配方案,或者使用正则表达式来匹配你的路径。:thinking: 但列出目录,我认为这是个问题…… 你能在处理器中发布你的代码吗?

这段代码片段展示了我遇到的一个类似问题。

func redirectToHttps(w http.ResponseWriter, r *http.Request) {
    http.Redirect(w, r, "https://xxxxxxxxxxxx.com:"+cfg.PortS+"/@", 307)        // 临时用于测试
}

正如在相邻主题中已经指出的那样,我怀疑问题并非出在 Go 的库或处理程序上,而是与涉及的反向代理配置有关。

问题与 net/http(已解决) Technical Discussion

我发现这样按预期工作 “http.HandleFunc(”/@",startHandler)" 然而,如果我将 ‘@’ 替换为 ‘#’,我会得到服务器账户的目录列表。 只是觉得这可能是一个安全问题。 毫无疑问,这对某些人来说非常有用。

这是一个URL路径解析的问题,与Go的net/http包处理特殊字符的方式有关。

在URL路径中,#字符有特殊含义——它表示URL片段标识符的开始。当服务器收到包含#的路径时,net/http包在内部处理时会将其解释为路径的一部分,但可能不会按你预期的方式匹配路由。

实际上,http.HandleFunc("/#", ...)无法正常工作,因为浏览器在发送请求时不会将#后面的部分发送到服务器。#及其后面的内容只在客户端有效。

示例代码演示:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    // 这个处理器实际上永远不会被调用
    http.HandleFunc("/#", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "This handler will never be called")
    })
    
    // 这个处理器可以正常工作
    http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Test handler works")
    })
    
    http.ListenAndServe(":8080", nil)
}

当你访问http://localhost:8080/#时,浏览器只发送/到服务器,因此会显示目录列表(如果目录存在且未设置默认文件)。

这不是Go的安全漏洞,而是HTTP协议和URL规范的一部分。如果你需要在路径中使用特殊字符,应该进行URL编码:

// 客户端访问时需要使用 %23 代替 #
http.HandleFunc("/%23", startHandler)

或者避免在URL路径中使用#字符,因为它本质上不是为服务器端路由设计的。

回到顶部