javaEE开发中遇到这样的问题:
数据库中有若干个用户:a,b,c
一个login页面,一个管理页面,一个退出页面.这其中有一个过滤器过滤是否登陆。
当用户a登陆后,可以查看自己的资料,http://127.0.0.1/haha/account.do?method=viewuser&userName=a
当这个url提交后服务器会给客户端显示出a的资料,而b用户没有登陆,a用户想看看b用户的资料,把后面的a换成b,提交后却看到了
b的详细资料。
怎样解决?现在的百度就有这样的漏洞。有高手没有给解决一下!!!!!
[b]问题补充:[/b]
// 过滤页面
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest myRequest = (HttpServletRequest) request;
HttpServletResponse myResponse = (HttpServletResponse) response;
HttpSession session = myRequest.getSession();
System.out.println("session Id:"+session.getId());
Object obj = session.getAttribute("loginUser");
Account account = (Account) obj;
String requestURI = myRequest.getRequestURI();
if(obj!=null || !"".equals(account.getUsername()) || !"".equals(session.getId()) || requestURI.endsWith("login.jsp") || requestURI.endsWith("login.do") || requestURI.endsWith("*.css") || requestURI.endsWith("*.js")){
filterChain.doFilter(request, response);
return; //不加return会出现异常
}else{
System.out.println("过滤掉一个非法请求!");
//返回到登录页面
request.getRequestDispatcher("../login.jsp").forward(request,response);
}
filterChain.doFilter(request, response);
return;
}
[b]问题补充:[/b]
fly_ever说的方法是可以,我只想写一次,就不用在每个action中重复写了。有没有更好的方法?
你的过滤器过滤是否登陆时,都进行了什么操作呢?
用户登录后在session中保存自己的用户名,
查看用户资料的action在通过过滤器时判断用户名与session中的是否一致。
这样b就不可能查看到a的资料了吧。
在servlet中或者filter中判断参数userName的值是否表示的就是session中的当前用户就可以了
session中难道不保存用户名吗?
百度也有这个漏洞?baidu真厉害。
form用post方法提交
既然过滤器中只对用户信息判是否为空了,
那就在查看用户资料时对获取的用户名与session中的用户名进行匹配检查吧。