【问题标题】:How to transfer secret usernames and passwords between ViewScoped beans?如何在 ViewScoped bean 之间传输秘密用户名和密码?
【发布时间】:2014-10-29 01:19:15
【问题描述】:

我正在开发一个 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";
}

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

我正在考虑的另一个解决方案是将 Web 应用程序的所有 JSESSIONID 作为键存储在 Map 中,并将用户名和密码作为值。为了完成这项工作,我想我需要在用户会话结束或过期时调用一个回调方法,以便我可以从 Map 中删除相关的 JSESSIONID。但是该解决方案的问题在于,我怀疑实现回调的最佳方法是什么,以便我可以 100% 确定在服务器创建新的类似 JSESSIONID 之前删除 Map 条目(即使我知道在这么短的时间内发生的可能性非常小)。此外,如果由于某种原因服务器在 bean(以及例如数据库操作)完成之前丢弃了 JSESSIONID(因为我可能会冒新类似的 JSESSIONID 是由服务器为另一个用户创建的,然后可能会与 JSESSIONID 和另一个 bean 正在服务的用户混合在一起)!

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

【问题讨论】:

  • 您不应该将密码存储在任何地方,甚至不在会话或请求范围内。应用程序应该以自己的身份访问数据库,而不是以用户身份访问数据库。
  • 是否有您不想为用户名使用会话属性的原因?在会话中仅保留该信息将使您的会话保持较小,并且您可以避免所有问题,不是吗?
  • @Martin Frey:您是在谈论使用 HttpServletRequest 和 HttpServletResposne 对象吗?我只是不知道该怎么做!
  • @EJP 我认为我需要将密码存储在某个地方以验证它们!为什么我不应该把它们储存在豆子里?是否有可能侵入豆类? “应用程序应该以自身身份访问数据库,而不是以用户身份访问数据库”到底是什么意思?
  • 密码只能用于身份验证,然后“丢弃”。一旦用户通过身份验证,该用户的整个会话就计算在内,因此不再需要密码。至于loggedInUser:如果你已经使用它,你可以简单地依赖 Spring Security。 (否则看一下;))-SecurityContextHolder.getContext().getAuthentication().getName();,然后调用您的 dao 从数据库中获取User,如果您需要更多。

标签: spring jsf session jsf-2 flash-scope


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。我知道这一切都发生在 Servlet 内部,因为“一切”都被编译成一个 Servlet。我只是想知道是否有某种方法可以欺骗服务器以暴露其 bean 属性和 flash 对象(我的经验是,黑客有时可以做的事情可能非常有创意,并且超出了可能的“正常”想法)!据我所知,除非整个服务器受到威胁,否则黑客不可能“进入”bean,然后所有解决方案都会失败!但也许使用 Spring 安全性或其他东西是解决问题的更好方法?
  • 只是为了让我的问题更清楚,然后我的意思是黑客侵入 bean 或 flash 对象,是是否有可能创建某种高级 GET 或 POST 请求访问 bean 属性或 flash 对象!我需要尽可能“偏执”的 JSF 相关安全系统!
  • 我也在考虑,也许某些 DDoS 攻击或缓冲区溢出攻击会使 Servlet 执行可能暴露 bean 属性和/或 flash 对象的意外事情。或者,黑客可以做的任何事情都可能以某种方式破坏我的 JSF webapp!
  • 对不起@KimJensen,除非你能突出一个特定的威胁,否则你会追逐阴影。 JSF 实现的 MVC 模型背后有很好的设计。除非您能够确定服务器端变量会进入视图的特定场景,否则您不是KISSing。识别此top 10 list 或此JSF vulnerability list 上的漏洞
  • @KimJensen,缓冲区溢出攻击在 java 中是 very unlikely,如果您知道 DDoS 攻击是什么,您应该知道它不会导致服务器端变量泄漏到客户端(除非粗制滥造的编码)。您正在接近 Web 应用程序安全性都错了。 “无论黑客能做什么,都可能以某种方式破坏我的 JSF webapp!”不是安全策略,您最终会犯错误。如果您担心应用的安全性,则需要设计一种连贯的、有凝聚力的安全方法,而不是随机偏执驱动的安全“功能”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
相关资源
最近更新 更多