【发布时间】:2014-05-03 09:11:28
【问题描述】:
我最近开始维护一个在线系统。它在前端使用带有 PrimeFaces 的 JSF,并带有 Java 后端。 JSF 对我来说是一项新技术。
在登录过程中,整个用户表(包括明文密码(即将修复))被加载到 HttpSession 属性中,并在系统的其他部分中引用。系统只有不到 50 个用户,所以数据的大小对我来说不是一个大问题。
然而,所有用户数据都在会话中这一事实是一个问题。
我是否不必要地担心,或者有没有办法通过客户端漏洞访问这些信息? 是否有任何其他理由可以作为紧急重写此机制的理由?
以下缩写代码:
login.xhtml
<p:inputText id="username" value="#{userBean.userName}" name="username"></p:inputText>
<p:password id="password" value="#{userBean.password}"></p:password>
<p:commandButton id="loginSubmit" value="Login" action="#{userBean.auth}"></p:commandButton>
UserBean.java
@ManagedBean(name = "userBean")
@SessionScoped
public class UserBean {
public String auth() {
// ...
FacesContext fctx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fctx.getExternalContext().getSession(true);
HashMap<Long, UserDetail> usersMap = dbBean.getAllUserDetails();
session.setAttribute("usersMap", usersMap);
// ...
}
}
【问题讨论】:
-
HttpSession 存储在服务器端,不应对任何最终用户可见,除非他有权访问服务器。但是实际上没有必要在会话中保留密码。这只是一个糟糕的设计。密码必须在服务器内存中,只有身份验证所需的时间。
-
同意。如果有人可以利用应用程序并在服务器上下文中运行代码,那么用户表是否处于会话中没有区别,利用者也可以访问托管 bean,然后可以访问数据库。这只是糟糕的设计,但它本身并不是一个安全漏洞。
标签: java jsf jsf-2 primefaces httpsession