0

我正在开发一个 webprojekt,为了最大程度地减少会话膨胀,我主要使用 ViewScoped bean。但是后来我面临的问题是我需要在我的 bean 之间传输客户端用户名和密码(以访问数据库等)。

我已经创建了一个系统,我使用 flash 对象在 bean 之间传输用户名和密码,例如:

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";
}

但我担心黑客是否有可能以某种方式操纵客户端,从而欺骗服务器暴露闪存对象!

我正在考虑的另一个解决方案是将 Web 应用程序的所有 JSESSIONID 作为键存储在 Map 中,并将用户名和密码作为值。为了完成这项工作,我想我需要在用户会话结束或到期时调用一个回调方法,以便我可以从 Map 中删除相关的 JSESSIONID。但是该解决方案的问题是我怀疑实现回调的最佳方法是什么,以便我可以 100% 确定在服务器创建新的类似 JSESSIONID 之前删除 Map 条目(即使我知道在这么短的时间内发生的可能性非常小)。

我希望对这个问题有深入了解的人会写下什么是最佳实践和 100% 安全的方法(我也认为大多数使用 JSF webapp 服务器的人都会遇到这个问题,因此这对其他人会有所帮助知道问题的最佳解决方案)。谢谢。

4

1 回答 1

1

我认为你在这里有一个误解。变量驻留在一个托管 bean 中,然后“传递”到另一个托管 bean 的事实并不意味着在物理介质上存在实际移动。所有 viewscoped beans 都在同一个存储区域中实现(我相信它是UIViewRoot对象)。在这个级别,这些实体之间存在隐式信任边界,除非两个 bean 之间存在用户可访问的移动(可能是客户端变量、URL 参数或其他 HTTP 工件),否则我看不到风险。

这意味着,无论@ViewScoped变量所在的特定 bean 是什么,它们都暴露于相同的漏洞(如果有的话)。在 bean 之间“传递”变量不会引入任何新的风险。除非您在任何地方向用户显示值(可能在 URL 中或在隐藏的 HTML 表单元素中),否则@ViewScoped对象本身不会引入新的风险(范围使用不当是另一回事)。

最终,如果您仍然担心它,只需在将变量交给另一个实体之前加密您的东西(考虑开销)

于 2014-09-04T18:31:57.900 回答