Безопасна ли отправка информации аутентификации токена через заголовки cook ie? - PullRequest
0 голосов
/ 25 апреля 2020

0

Я ни в коем случае не инженер по безопасности, и я только начал свое путешествие как веб-разработчик. Я использую пакет python, известный как django для моего бэкэнда, реагирую. js для моего интерфейса. Недавно я включил django -каналы, это пакет, который дает мне возможность использовать веб-сокеты в моем проекте. Поскольку я развязал свои передний и внутренний интерфейсы, основа аутентификации, которую я использую, основана на использовании токенов (рассмотрим использование jwt).

Проблема в том, что с javascript невозможно отправить заголовки аутентификации через подключение к websocket (или так мне сказали), поэтому многие люди используют куки для отправки этого токена аутентификации. Вот пример фрагмента того, как я отправляю токен из моего внешнего интерфейса:

const path = wsStart + 'localhost:8000'+ loc.pathname
document.cookie = 'authorization=' + token + ';' 
this.socketRef = new WebSocket(path)

, делая это, позволяет мне затем извлечь информацию о токене с помощью специального промежуточного программного обеспечения на моем бэкэнде.

import re
from channels.db import database_sync_to_async
from django.db import close_old_connections

@database_sync_to_async
def get_user(token_key):
    try:
        return Token.objects.get(key=token_key).user
    except Token.DoesNotExist:
        return AnonymousUser()


class TokenAuthMiddleware:
    """
    Token authorization middleware for Django Channels 2
    see:
    https://channels.readthedocs.io/en/latest/topics/authentication.html#custom-authentication
    """

    def __init__(self, inner):
        self.inner = inner

    def __call__(self, scope):
        return TokenAuthMiddlewareInstance(scope, self)


class TokenAuthMiddlewareInstance:
    def __init__(self, scope, middleware):
        self.middleware = middleware
        self.scope = dict(scope)
        self.inner = self.middleware.inner

    async def __call__(self, receive, send):
        close_old_connections()
        headers = dict(self.scope["headers"])
        print(headers[b"cookie"])
        if b"authorization" in headers[b"cookie"]:
            print('still good here')
            cookies = headers[b"cookie"].decode()
            token_key = re.search("authorization=(.*)(; )?", cookies).group(1)
            if token_key:
                self.scope["user"] = await get_user(token_key)

        inner = self.inner(self.scope)
        return await inner(receive, send) 


TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))

Однако это подняло некоторую форму красных флажков безопасности (или так мне сказали).

Поэтому я хочу sh распространить этот вопрос на ветеранов безопасности там:

  1. Безопасна ли эта методология отправки аутентификационной информации токена через заголовки cook ie?
  2. Безопасна ли моя реализация этого метода?
  3. Есть ли способ защитить ее еще дальше?

1 Ответ

1 голос
/ 26 апреля 2020
  1. если вы используете подключение через веб-сокет HTTPS (WSS), то в основном.
  2. да, это выглядит хорошо
  3. Да, есть лучший способ.

Создайте обычную конечную точку HTTP (для этого имени домена), где вы можете установить (обычную) django сессионную готовку ie, обычно это будет ваша конечная точка django для входа. Это установит повар ie, который будет HTTPONLY (он же не читается с javascript). Это важно, чтобы любой другой код js, который вы могли бы использовать на своей странице, не мог прочитать это значение и украсть его.

Затем вы можете использовать https://channels.readthedocs.io/en/latest/topics/sessions.html.

Обратите внимание, что при работе с гордостью (только с HTTP) вы должны установить SESSION_COOKIE_SECURE=True в настройках django.

...