Go 更新:使用js websockets发送源标题

Go 更新:使用js websockets发送源标题,go,websocket,gorilla,Go,Websocket,Gorilla,我一直在Go中使用gorilla websocket,在实现基本echo示例时,我在部署服务器后记录了一个错误 找不到来源 Websocket版本!=十三, 我找到了一种绕过这个问题的方法,使检查原点的函数始终返回true var wsUpgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool {

我一直在Go中使用gorilla websocket,在实现基本echo示例时,我在部署服务器后记录了一个错误

找不到来源 Websocket版本!=十三,

我找到了一种绕过这个问题的方法,使检查原点的函数始终返回true

var wsUpgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}
但这感觉不对。因此,我正在寻找解决这个问题的方法

更新:在对这个问题进行了另一次研究之后,看起来我实际上是在向客户机实现添加origin头,这是javascript-websocket实现

@本吉克 我通过javascript html5应用程序连接到websocket,该应用程序不在同一台服务器上,但由我通过chrome在本地运行

那么我该怎么做呢。

通过读取指示,当为类型的
CheckOrigin
字段提供nil值时,将使用安全默认值。默认情况下,在允许请求之前,将检查传入请求的来源字段与主机头值是否相等。文档表明浏览器不强制执行跨源有效性,强制执行是服务器应用程序的责任。您可以在Gorilla库的中看到这是如何完成的

文档和源代码指明了
websocket
包中的一个函数,该函数充当上述示例代码的工厂。采用自定义缓冲区大小并覆盖CheckOrigin以始终返回true。您可以在
HttpHandler
中使用此工厂函数来升级连接,而不是创建自定义的
升级程序

func webSocketHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := websocket.Upgrade(w, r, nil, 1024, 1024)
    defer conn.Close()

    if err != nil {
        http.Error(w, err, http.StatusInternalServerError)
        return
    }

    conn.WriteMessage(websocket.TextMessage, []byte("Hello, world!"))
}

检查服务器上WebSocket握手请求的原始标头,因为该标头旨在保护服务器免受攻击者发起的受害者浏览器跨站点连接的攻击!在握手请求中使用会话单个随机令牌(如CSRF令牌),并在服务器上验证它们。这是我读到的websocket安全博客中的一句话。那么空的CheckOrigin函数不会导致任何安全漏洞吗@CodingPickle@Whiteclaws如果要使用默认的CheckOrigin函数,则需要确保客户端库在其请求中包含Origin头。如果您将问题更新为包含您的体系结构,我可以更新我的答案以反映更新。