Как запретить пользователю устанавливать значение cookie идентификатора сеанса, используемого pyramid_beaker?

У меня есть приложение пирамиды, используя pyramid_beaker. Вот моя конфигурация:

# Options For Sessions and Caching:
session.type = file
session.data_dir = %(here)s/../../data/sessions/data
session.lock_dir = %(here)s/../../data/sessions/lock
# Session Options:
session.key = session_id
session.secure = false
session.timeout = 3600
session.cookie_expires = true
session.cookie_domain = .mydomain.local
session.httponly = true
# Encryption Options:
session.encrypt_key = c]?wvL",ni3J.)d8(e~z8b-9Le=Anh'.QMytBj^Kukfi<79C$Cg22)cX;__xs6?S
session.validate_key = \2R('?pL]\Z_8?(o`.?.?^.RF6t*5pCh6PH`~aon%H`PX$;E}"((mu-@(?G<=!:+
# pyramid_beaker specific option
session.cookie_on_exception = true

А вот вид формы входа в систему:

def login(self):

    message_html = _('view.login.welcome-message', default='Please log in.')
    login_url = self.request.route_url('login')
    login = ''
    password = ''
    referrer = self.request.url
    if referrer == login_url:
        referrer = self.request.route_url('home')
    came_from = self.request.POST.get('came_from', referrer)
    csrf_token = self.request.session.get_csrf_token()

    if 'form.submitted' in self.request.POST:
        login = self.request.POST.get('login')
        password = self.request.POST.get('password')
        if csrf_token == self.request.POST.get('csrf_token'):
            if login in USERS:
                manager = BCRYPTPasswordManager()
                if manager.check(USERS[login], password):
                    headers = remember(self.request, login)
                    return HTTPFound(location=came_from, headers=headers)

        message_html = _('view.login.failed-login-message', default='Login failed!')

    return {
        'message_html': message_html,
        'url': login_url,
        'login': login,
        'password': password,
        'came_from': came_from,
        'csrf_token': csrf_token,
    }

Теперь, когда пользователь хочет войти в систему, представление отображает форму и файл cookie. session_id генерируется. Когда пользователь отправляет правильную форму, значение cookie принимается для аутентификации пользователя.

Ничто не мешает пользователю изменить значение куки перед отправкой формы. Такое поведение, по-видимому, является недостатком безопасности в соответствии с этим вопросом.

Итак, как использовать pyramid_beaker для того, чтобы сервер генерировал новое значение session_id при успешном входе в систему вместо того, чтобы извлечь его из cookie?

1 ответ

Сессионный API Pyramid предоставляет возможность аннулировать сессии при повышении привилегий. Вы можете сделать это через request.session.invalidate() в вашем представлении входа. сама pyramid_beaker поддерживает request.session.regenerate_id() сохранить данные сеанса, но это не является частью API сеанса Pyramid и будет работать только при использовании pyramid_beaker. Если вы беспокоитесь о том, что пользователь угадывает чей-либо идентификатор сеанса, вы защищены здесь, потому что идентификатор, который хранится в cookie, подписывается, если вы указываете beaker's session.secret вариант.

Другие вопросы по тегам