龚越权:龚越权是指攻击者尝试访问与他具有相同权限的用户的资源
纵向越权:纵向越权是指低级攻击者尝试访问高级用户的资源
对于纵向越权,可以通过设置用户角色并为每个角色提供不同的权限来避免。
关于横向越权,很麻烦。 在横向越权中,用户忘记密码并重置密码时,回答问题进入密码重置阶段时,只要知道其他用户的用户名,就可以轻松更改该用户的密码,实现越权访问
在这种情况下,为了防止横向越权,可以使用缓存进行辅助。 如果问题的答案正确,则在高速缓存中保存用户名和唯一数字对的数据,并返回包含的唯一数据。 重置密码时,我们的参数不仅需要用户名和密码,还需要前面生成的唯一数字。 根据用户名从缓存中检索对应的数字,如果有检索到的数字和传递给参数的想法等,就证明重置的当前用户的密码。 否则,不然,不重置。
重置密码并回答问题
publicserverresponsecheckanswer (字符串用户名称、字符串question、字符串answer ) int result count=user mapper.check answer ()
stringforgettoken=uuid.random uuid ().toString ); //放入缓存
token cache.setkey (token cache.token _ prefix username,forgetToken ); returnserverresponse.createbysuccess (forget token );
} returnserverresponse.createbyerror ('用户回答错误);
}
密码重置
publicserverresponseforgetresetpassword (字符串用户名,字符串密码新,字符串格式令牌) IF(stringutils.ISBlanng
}
serverresponsevalidresponse=this.check valid (username,Const.USERNAME ); if(validresponse.issuccess () (returnserverresponse.createbyerror ) )“用户不存在”;
之所以不使用//session而使用Cache,是因为在APP应用程序结束时,如果缓存没有过期,则下次启动程序时缓存数据会保留下来//但Seesion中的数据只有一组
string token=token cache.getkey (token cache.token _ prefix username ); if(stringutils.isblank(Token ) ) }
server response.createbyerror (' token无效或过期);
}if(stringutils.equals(Token,forgetToken ) ) ) )。
string m D5 password=m D5 util.m D5 encode utf8(password new ); int result count=user mapper.updatepasswordbyusername (username,md5Password ); if (结果计数0 ) returnserverresponse.createbysuccess (“密码更改成功”)
}
} else { returnserverresponse.createbyerror (' token错误。 请重新获取更改了密码的token ' );
} returnserverresponse.createbyerror ('密码更新失败);