Безопасность¶
Здесь рассматривается базовая безопасность для протоколов, которые вы обслуживаете через каналы и помощников, которые мы предоставляем.
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.