横向越权纵向越权安全漏洞的解决

心不动则不痛 提交于 2020-02-09 18:28:03

一.什么是横向越权和纵向越权.

  1.横向越权:攻击者想访问与他权限相同的用户,例如:在忘记密码回答问题成功后,会跳到重设密码的页面,这个时候如果用户随意填用户名和密码,而且数据库也刚刚好存在这个用户时,那么就会修改其他用户的密码,这就是横向越权

  2.纵向越权:低级别攻击者想访问高级别用户的资源。

二.怎么解决

  1.横向越权:在回答问题时,成功的时候,会在服务端根据用户名生成一个token(随机数和用户名的映射)保存在本地缓存里,具体如下:

1            //这段代码是在检查回答问题的答案的接口里面的,也就是在回答问题时生成这个token,标志这个用户名         String forgetToken = UUID.randomUUID().toString();
2             TokenCache.setKey(TokenCache.TOKEN_PREFIX+username,forgetToken);
3             return ServerResponse.creatBySuccess(forgetToken);            

  这里使用Guaua本地缓存,用来保存token,这个token会定期失效具体代码如下:

public class TokenCache {   //前缀
    public static final String TOKEN_PREFIX = "token_";
    private static Logger logger= LoggerFactory.getLogger(TokenCache.class);
    private static LoadingCache<String,String> localCache =         CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000)        .expireAfterAccess(12, TimeUnit.HOURS).
             build(new CacheLoader<String, String>() {
                @Override
                //默认的数据实现,如果get方法没有获取到数据时,就会调用这个方法进行加载
                public String load(String s) throws Exception {
                    return "null";
                }
            });
    public static void setKey(String key,String value){
        localCache.put(key,value);
    }
    public  static  String getKey(String key){
        String value = null;
        try{
            value = localCache.get(key);
            if("null".equals(value)){
                return null;
            }

            return value;
        }
        catch(Exception e){
            logger.error("locache get error",e);
        }
        return null;


    }
}

  这个token最后返回给前台,跳转到重设密码时会把这个token传过去,然后后台根据这个token(随机数与重设密码时输入的用户名的映射)与本地那个比较来判断是否在修改当前用户

           //这段代码在重设密码接口里面     String token = TokenCache.getKey(TokenCache.TOKEN_PREFIX+username);
        if(StringUtils.isBlank(token)){
            return ServerResponse.creatByErrorMessage("token无效或过期");
        }     //当跳到这个重设密码时,前台会把token传过去,后台会从本地缓存里面拿出来比较,正确了就进行密码重设。
        if(StringUtils.equals(forgetToken,token)){
            String md5Password = MD5Util.MD5EncodeUtf8(passwordnew).toString();
            int countResult = userMapper.undatePasswodByUsername(username,md5Password);
            if(countResult>0){
                return ServerResponse.creatBySuccessMessage("修改密码成功");
            }
        }else{
            return ServerResponse.creatByErrorMessage("token错误");
        }

  2.纵向越权:通过设置用户角色,为不同的角色提供不同的权限来避免,例如在用户注册的时候,就设置好角色,持久化到数据库,到时再进入后台管理员时进行角色状态判断就行,如下:

       if(user.getRole()== Const.Role.ROLE_ADMIN){
                session.setAttribute(Const.CURRENT_USER,user);
                return response;
            }else{
                return ServerResponse.creatByErrorMessage("不是管理员,不能登录");
            }

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!