一.什么是横越权和纵越权?
1 .跨界越权(攻击者尝试访问与自己权限相同的用户。 例如,忘记密码并回答问题后,转到要重置密码的页面。 此时,用户可以自行填写用户名和密码,并在数据库中正好存在该用户时修改其他用户的密码。 这是跨界越权
2 .纵向越权:低级攻击者想访问高级用户的资源。
二.如何解决
1 .生成横向越权(回答问题时,如果成功,则在服务端根据用户名进行token )随机数与用户名的映射)并将其保存到本地缓存中。 具体如下。
1 //此代码位于检查问题答案的界面中。 即,在回答问题时生成该token,标记用户名
stringforgettoken=uuid.random uuid ().toString ); 2 token cache.setkey (token cache.token _ prefix username,forgetToken ); 3 returnserverresponse.creatbysuccess (forget token );
在这里,我们使用Guaua本地缓存来保存token。 此token定期禁用。 具体代码如下。
公共类令牌缓存{
//前缀
publicstaticfinalstringtoken _ prefix=' token _ ';
隐私保护日志gerlogger=logger factory.getlogger (token cache.class;
privatestaticloadingcachelocalcache=
CacheBuilder.newBuilder ().initial capacity (1000 ).maximumsize (10000 ) )。
. expireafteraccess(12,TimeUnit.HOURS )。
构建(newcacheloader ) )。
@Override
//如果get方法没有检索数据,则调用此方法加载缺省数据实现
公共字符串加载(字符串) throws Exception {
返回'空';
}
);
publicstaticvoidsetkey (字符串密钥,字符串值) {
本地缓存. put (key,value;
}
publicstaticstringgetkey (字符串密钥) {
字符串值=null;
try{
value=local cache.get (密钥;
if('null'.equals(value ) ) ) ) ) ) ) ) )。
返回空值;
}
返回值;
}
catch(exceptione ) {
logger.error (锁定器),e );
}
返回空值;
}
}
此token最后返回前台,在重置密码时传递此token。 然后,后台将此token (重置随机数和密码时输入的用户名映射)与本地用户名进行比较,以确定是否修改了当前用户
//此代码位于复位密码接口中
string token=token cache.getkey (token cache.token _ prefix username ); if(stringutils.isblank(Token ) ) returnserverresponse.creatbyerrormessage (' token无效或过期');
}
//跳到此密码重置时,前台传递token,后台从本地缓存中检索并比较,如果正确,则进行密码重置。 if (string utils.equals (forget Token,token ) ) ) ) ) )。
string m D5 password=m D5 util.m D5 encode utf8(password new ).toString ); int count result=user mapper.undatepasswodbyusername (username,md5Password ); if (计数结果0 ) returnserverresponse.creatbysuccessmessage (“密码更改成功”)
}
} else { returnserverresponse.creatbyerrormessage (' token错误);
}
2 .通过设置用户角色并为每个角色提供不同的权限,来避免垂直越权: 例如,可以在用户注册时设定角色,并持久化到数据库中,在那时进入后台管理者时判断角色的状态。 如下。
if (user.getrole (==const.role.role _ admin ) {
SSS ion.set attribute (const.current _ user,user );
返回响应;
}else{
returnserverresponse.creatbyerrormessage;
}