Как передавать секретные имена пользователей и пароли между компонентами ViewScoped?
Я работаю над веб-проектом, где я для того, чтобы минимизировать вздутие сессии, использую в основном компоненты ViewScoped. Но затем я сталкиваюсь с проблемой, которая заключается в том, что мне нужно передавать имена пользователей и пароли клиентов между моими компонентами (для доступа к базе данных и т. Д.).
Я создал систему, в которой я использую объекты flash для передачи имен пользователей и паролей между компонентами, например:
public String gotoNextView() {
ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
external.getFlash().put("user_name", (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("user_name"));
external.getFlash().put("password", (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("password"));
return "/../../next_view.xhtml";
}
Но я беспокоюсь о том, может ли хакер каким-либо образом манипулировать клиентом и тем самым обмануть сервер, чтобы выставить флэш-объекты!
Другое решение, о котором я думаю, - это сохранить все JSESSIONID для веб-приложения в виде ключей на карте с именами пользователей и паролями в качестве значений. Для этого я полагаю, что мне нужен метод обратного вызова, когда сеанс пользователя заканчивается или заканчивается, чтобы я мог удалить соответствующий JSESSIONID с карты. Но проблема с этим решением заключается в том, что я сомневаюсь в том, что является наилучшим способом реализации обратного вызова, чтобы я был на 100% уверен, что запись Map удаляется до того, как сервер создаст новый аналогичный JSESSIONID (даже если я Знайте, что шансы крайне малы, что это произойдет за такое короткое время). Также я сомневаюсь, что делать с bean-компонентами, работающими с JSESSIONID (пользователем), если по какой-то причине сервер сбрасывает JSESSIONID до того, как bean-компонент (и, например, операции с базой данных) завершится (поскольку я могу рискнуть, что новый аналогичный JSESSIONID создается сервером для другого пользователя, который затем может смешаться с JSESSIONID и пользователем, обслуживаемым другим бином)!
Я надеюсь, что кто-то с глубоким пониманием проблемы напишет о том, что является наилучшей практикой и 100% безопасным путем к этому (также я предполагаю, что большинство людей, работающих с серверами веб-приложений JSF, сталкиваются с этой проблемой, и поэтому другим было бы полезно знать лучшее решение проблемы). Благодарю.
1 ответ
Я думаю, что вы ошибаетесь здесь. Тот факт, что переменная находится в одном управляемом бине, а затем "передается" другому управляемому бину, не означает, что существует реальное движение через физическую среду. Все видоисканные компоненты реализованы в одной и той же области хранения (я считаю, что это UIViewRoot
объект). На этом уровне существует неявная Граница Доверия между этими сущностями, и если между двумя bean-компонентами (возможно, переменная на стороне клиента, параметр URL-адреса или другой артефакт HTTP) нет доступа к пользователю, я не вижу риска.
Это означает, что независимо от конкретного @ViewScoped
Бин, в котором находится переменная, все они подвержены одной и той же уязвимости (если есть). "Передача" переменной между компонентами не представляет никакого нового риска. Если вы не отображаете значения где-либо для пользователей (возможно, в URL-адресе или в скрытом элементе HTML-формы), новый риск не возникает @ViewScoped
объект сам по себе (неправильное использование областей - другое дело).
В конечном счете, если вы все еще беспокоитесь об этом, просто зашифруйте свои данные (учитывая накладные расходы), прежде чем передать переменную другому объекту.