研究本地服务系列文章:
上篇文章“图一乐研究之初识Yakit”有的师傅不明白为啥巴斯要搞个grpc和yak engine通信。现如今有些桌面软件,特别是非原生开发的桌面软件,会将核心部分与gui分离,通过网络接口通信,虽然是监听本地的 localhost 但也不安全。
上篇文中的 gRPC 不能在浏览器中跑起来,假设暴露是 http 协议,就能诱导用户访问构造的恶意页面,在用户浏览器对本地服务发送恶意payload,相关案例:https://xlab.tencent.com/cn/2018/10/23/weixin-cheater-risks/ 。
gRPC是基于HTTP2协议,默认使用H2C(H2C和H2都是HTTP/2协议的版本,其中H2C是不加密的版本,而H2是加密的版本。)
Yak默认也是使用的h2c,只可惜Chrome和Firefox浏览器虽然支持HTTP/2协议,但是它们都不支持非加密的H2C版本。
实践 分别用 net 或者 h2c 写客户端请求服务,编译为wasm后运行请求均无效:
// example.go
// net.dial
c, err := net.Dial("tcp", "127.0.0.1:8233")
if err != nil {
fmt.Println(err)
return
}
defer c.Close()
fmt.Println(c.LocalAddr(), c.RemoteAddr())
// ...
// h2c
client := http.Client{
// Skip TLS dial
Transport: &http2.Transport{
AllowHTTP: true,
DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
return net.Dial(network, addr)
},
},
}
resp, err := client.Get("<http://127.0.0.1:49024>")
if err != nil {
log.Fatal(fmt.Errorf("error making request: %v", err))
}
fmt.Println(resp.StatusCode, resp.Proto)
找 AI 给我润色一下标准答案:
还有哪些注意事项呢🤔️: