电商网站横向越权与纵向越权问题解决

横向越权

指攻击者尝试访问与他拥有相同权限的用户的资源,即同等级别的资源访问。如,一个用户试图访问其他用户的个人资料、尝试篡改其他用户的密码。

解决方法: 添加有有效期的token值标识,操作时比对。

解决案例:
Q:编码时将重置密码问题与重置密码分为两个接口编写,重置密码传入值为用户名及密码,用户修改密码时进行密保答题,在成功答题后可通过持有其他用户用户名对同级用户进行密码修改。
S:指提交答案时,若回答正确,则返回值中添加一个token,并传递给下一接口,在密码修改时,获取有有效期的token,比对成功后,才能够进行修改。

用户接口设计:
提交问题答案

request
username,question,anser
response
succese
	{
		"status": 0,
		"data": "forgetToken"
	}
fail
	{
		"status": 1,
		"msg": "问题回答错误"
	}

重置密码

request
username,passwordNew,forgetToken
response
succese
	{
		"status": 0,
		"msg": "修改密码成功"
	}
fail
	{
		"status": 1,
		"msg": "修改密码操作失败"
	}
或
	{
		"status": 1,
		"msg": "token已失效,请重新进行验证"
	}

编码展示:

提交问题答案

public ServerResponse checkAnswer(String username, String question, String answer){
        int resultCount = userMapper.checkAnswer(username, question, answer);
        if(resultCount>0){
            String forgetToken = UUID.randomUUID().toString();
TokenCache.setKey(TokenCache.TOKEN_PREFIX+username, forgetToken);
            return ServerResponse.createBySuccess(forgetToken);
        }
        return ServerResponse.createByError("用户答案错误");

重置密码

public ServerResponse forgetResetPassword(String username, String passwordNew, String forgetToken){
        if(StringUtils.isBlank(forgetToken)){
            return ServerResponse.createByError("参数错误,Token需要传递");
        }
        ServerResponse validResponse = this.checkValid(username, Const.USERNAME);
        if(validResponse.isSuccess()){
            return ServerResponse.createByError("用户不存在");
        }
        String token = TokenCache.getKey(TokenCache.TOKEN_PREFIX+username);
        if(StringUtils.isBlank(token)){
            ServerResponse.createByError("token无效或过期");
        }
        if(StringUtils.equals(token, forgetToken)){
            String md5Password = MD5Util.MD5EncodeUtf8(passwordNew);
            int resultCount = userMapper.updatePasswordByUsername(username, md5Password);
            if(resultCount>0){
                return ServerResponse.createBySuccess("修改密码成功");
            }
        }else{
            return ServerResponse.createByError("token错误,请重新获取修改密码的token");
        }
        return ServerResponse.createByError("密码更新失败");
}

纵向越权

指一个低级别攻击者尝试访问高级别用户的资源,如普通用户试图访问管理员权限的内容。

解决方法: 添加身份标识,并设置不同的标识权限。

解决案例:
电商网站中有两类用户:管理员、普通用户。
通过设置常量值,标识用户,并对管理员开放管理权限。

你可能感兴趣的:(JAVA)