2015-10-24 3 views
1

Я играл вокруг с гориллой-WebSocket в Go, и как я реализовал основные эхо-пример, я зарегистрировал ошибку после развертывания сервераUpdate: Отправить заголовок происхождения с Js WebSockets

Origin не найден WebSocket версия! = 13

я нашел способ обойти это, делая функцию, которая проверяет происхождение всегда возвращает истину

var wsUpgrader = websocket.Upgrader{ 
    ReadBufferSize: 1024, 
    WriteBufferSize: 1024, 
    CheckOrigin: func(r *http.Request) bool { 
     return true 
    }, 
} 

Но это не так. Поэтому я ищу способ исправить эту проблему.

Update: После того, как другой взгляд на проблему, кажется, что я на самом деле хотите добавить заголовок происхождения для реализации клиента, который является реализация JavaScript WebSocket

@benjic Im, подключающихся к WebSocket через Приложение javascript html5, которое не размещено на одном сервере, но выполняется локально мной через chrome

Так как это сделать.

ответ

1

Чтение через Gorilla WebSocket Documentation указывает, что если для поля CheckOrigin для Upgrader указано значение nil, используется безопасное значение по умолчанию. По умолчанию выполняется проверка поля Origin входящего запроса с заголовком Host, чтобы подтвердить, что они равны перед разрешением запроса. Документация указывает, что браузеры не применяют действительную силу перекрестного происхождения, и ответственность за ее применение лежит на серверном приложении. Вы точно видите, как это делается в source code для библиотеки Gorilla.

Документация и источник указывают функцию Upgrade в пакете websocket, который выступает в качестве фабрики для вашего примера кода выше. The factory function берет собственный размер буфера и переопределяет CheckOrigin, чтобы всегда возвращать true. Вместо создания пользовательского Upgrader вы можете использовать эту заводскую функцию в 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!")) 
} 
+0

Проверьте заголовок Origin запроса на подтверждение соединения WebSocket на сервере, поскольку этот заголовок был разработан для защиты сервера от инициированных злоумышленниками межсайтовых подключений браузеров-жертв! Используйте сеансовые индивидуальные случайные токены (например, CSRF-токены) в запросе квитирования и проверяйте их на сервере. Это цитата из блога безопасности websocket, который я читал. И поэтому пустая функция CheckOrigin не вызывает никаких уязвимостей системы безопасности ? @CodingPickle – Whiteclaws

+1

@Whiteclaws Если вы хотите использовать функцию CheckOrigin по умолчанию, вам необходимо убедиться, что ваша клиентская библиотека включает заголовок Origin с его запросом. Если вы обновите вопрос, чтобы включить свою архитектуру, я могу обновить свой ответ, чтобы отразить обновление. –