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