橫向越權縱向越權安全漏洞的解決


一.什么是橫向越權和縱向越權.

  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("不是管理員,不能登錄");
            }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM