楼主你的如下博客中的代码有安全漏洞

楼主你的如下博客中的代码有安全漏洞:

http://blog.csdn.net/xyang81/article/details/7727141

------------------------------------------------------------------------------------------

如果用户张三将邮件中收到的链接中的id或username改成别人的(如李四的),就能够:
1,
将其他用户(李四)已经验证的邮箱再变为未验证的状态
2,
查看其他用户(李四)的数据,因为他已经用李四的身份登录了,只是他(李四)的邮箱状态为未认证,权限有限制而已

3,

重设其他任何用户的密码,只要知道其username即可

------------------------------------------------------------------------------------------

1和2的证明如下:
http://localhost:8080/AccountActivate/activateAccount?id=800&checkCode=any_thing_here
上面id=800,而800是李四的,
张三用上面修改过id的链接访问网站,


在ActivateAccountServle中
User user = userDao.findUserById(id);
user.setActivated(GenerateLinkUtils.verifyCheckcode(user, request));
userDao.updateUser(user);  
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("/accountActivateUI").forward(request, response);


代码中未加判断,直接把李四的activated状态给set了, 由于checkCode的值是随便写的,或者是张三自己的checkcode,
verifyCheckcode()会返回false
那么李四的activated被设置为false,即邮箱状态又变成未验证了,因为update到DB里了.
更可怕的是,李四的user信息直接被存到session中去了,也就是说张三直接以李四的身份登录了
那么他可以做很多事情,只要不是那些要求邮箱必须为验证状态的事情,张三都可以做.
例如查看李四的账号信息,业务信息等.


当然这只是粗心所致,修改起来也很简单:
只要才上述几个步骤前加如下判断即可
if(GenerateLinkUtils.verifyCheckcode(user, request)){
//上面那些代码应放到这里

}

------------------------------------------------------------------------------------------

3的证明如下:
用户点击重置密码的链接后, servlet中没有检查checkcode的值, 所以无法判断此链接是否是伪造的,见下图


即使上面判断了checkcode也不行,因为你在用户重置密码时,所修改的用户名居然是让用户自主提交的.


String userName = request.getParameter("userName");  //这里的用户名来自客户提交的表单
String newPassword = request.getParameter("newPassword");  
String newPassword2 = request.getParameter("newPassword2");  
         
UserDao userDao = UserDaoImpl.getInstance();  
User user = userDao.findUserByName(userName);  //根据此用户名得到User
user.setPassword(newPassword);  //然后未经判断,直接把此用户的密码给改掉了, 这样任何一个用户都可以修改其他人的密码了,只要得到别人的用户名.


解决方法: 通过验证码锁定用户信息后,将User对象存在session里,始终不要发给客户端, 注意:千万不要把此用户名发的客户端的hidden中,因为hidden是不安全的,客户可以通过源代码看到并很容易在提交前篡改.


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值