Безопасность

Здесь рассматривается базовая безопасность для протоколов, которые вы обслуживаете через каналы и помощников, которые мы предоставляем.

WebSockets

WebSockets начинают свою жизнь как HTTP-запрос, включая все куки и заголовки, и поэтому вы можете использовать стандартный код Аутентификация для захвата текущих сессий и проверки идентификаторов пользователей.

Однако при использовании WebSockets также существует риск подделки межсайтовых запросов (CSRF), поскольку они могут быть инициированы с любого сайта в Интернете на ваш домен, и при этом у пользователя останутся куки и сессия с вашего сайта. Если вы передаете частные данные по сокету, вам следует ограничить сайты, которым разрешено открывать сокеты для вас.

Это делается с помощью пакета channels.security.websocket и двух содержащихся в нем промежуточных программ ASGI, OriginValidator и AllowedHostsOriginValidator.

OriginValidator позволяет вам ограничить допустимые варианты заголовка Origin, который отправляется с каждым WebSocket, чтобы указать, откуда он пришел. Просто оберните его вокруг кода вашего приложения WebSocket следующим образом и передайте ему список допустимых доменов в качестве второго аргумента. Вы можете передать только один домен (например, .allowed-domain.com) или полное происхождение в формате scheme://domain[:port] (например, http://allowed-domain.com:80). Порт необязателен, но рекомендуется:

from channels.security.websocket import OriginValidator

application = ProtocolTypeRouter({

    "websocket": OriginValidator(
        AuthMiddlewareStack(
            URLRouter([
                ...
            ])
        ),
        [".goodsite.com", "http://.goodsite.com:80", "http://other.site.com"],
    ),
})

Примечание: Если вы хотите разрешить любой домен, то используйте origin *.

Часто набор доменов, которые вы хотите ограничить, совпадает с настройкой Django ALLOWED_HOSTS, которая выполняет аналогичную проверку безопасности для заголовка Host, и поэтому AllowedHostsOriginValidator позволяет вам использовать эту настройку без необходимости повторно объявлять список:

from channels.security.websocket import AllowedHostsOriginValidator

application = ProtocolTypeRouter({

    "websocket": AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter([
                ...
            ])
        ),
    ),
})

AllowedHostsOriginValidator также будет автоматически разрешать локальные соединения, если сайт находится в режиме DEBUG, подобно проверке хоста в Django.

Вернуться на верх