Golang遇到问题,求助大神解答
Golang遇到问题,求助大神解答 我发现以下代码按预期工作:
http.HandleFunc("/@",startHandler)
然而,如果我将 ‘@’ 替换为 ‘#’,我会得到服务器账户的目录列表。
我认为这可能是一个安全问题。
毫无疑问,这对某些人来说非常有用。
也许曾有中情局或摩萨德的人员为开源社区做出过贡献。
更多关于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路径中使用#字符,因为它本质上不是为服务器端路由设计的。

