1.已解密的登入請求
1.1.1 產生的原因
登入介面,前端傳入的密碼引數沒有經過md5的加密就直接傳給了後端
1.1.2 解決方法
前端程式碼傳參的時候做md5加密處理
2.對談標識未更新
2.1.2 產生原因
3.「Content-Security-Policy」,「X-Content-Type-Options」,「X-Content-Type-Options」頭缺失或不安全
3.1.1 產生原因
nginx.conf設定裡沒有新增對應的請求頭
3.1.2 解決方法
nginx.conf裡設定缺失的請求頭
4.垂直越權
4.1.1 漏洞分析
1 @Target(ElementType.METHOD) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface SecurityAuth { 4 5 /** 6 * 擁有許可權的角色名 7 * @retuen 8 */ 9 String roleName(); 10 }
1 @Aspect 2 @Component 3 public class SecurityAspect { 4 5 @Autowired 6 private SysRoleUserService sysRoleUserService; 7 8 /** 9 * 自定義註解切點 10 */ 11 @Pointcut("@annotation(com.broadu.modules.filter.SecurityAuth)") 12 public void annotationAspect(){} 13 14 /** 15 * 前置通知 16 */ 17 @Around("annotationAspect()") 18 public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable { 19 // 拿到響應 20 HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); 21 // 拿到當前登入使用者 22 UserDetail user = SecurityUser.getUser(); 23 if(null == user){ 24 // 未登入 25 throw new RenException(ErrorCode.ACCOUNT_NOT_EXIST,"該使用者不存在"); 26 } 27 // 從切面織入點處通過反射機制獲取織入點處的方法 28 MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 29 // 獲取切入點所在的方法 30 Method method = signature.getMethod(); 31 // 獲取註解 32 SecurityAuth auth = method.getAnnotation(SecurityAuth.class); 33 // 獲取該方法使用的角色 34 String roleNames = auth.roleName(); 35 // 獲取該使用者的角色列表 36 if(ObjectUtil.notEqual(user.getSuperAdmin(),1)){ 37 List<String> roleList = sysRoleUserService.getRoleNameList(user.getId()); 38 List<String> list = new ArrayList<>(); 39 if(null != roleList && roleList.size() > 0){ 40 String[] roleName = roleNames.split(","); 41 for (String str : roleName) { 42 for (String s : roleList){ 43 if(ObjectUtil.equal(str,s)){ 44 list.add(s); 45 break; 46 } 47 } 48 } 49 if(list.size() == 0){ 50 // 沒有許可權 51 throw new RenException(ErrorCode.ACCOUNT_NOT_PERMISSION,"該使用者無許可權存取"); 52 } 53 } 54 } 55 // 有許可權 56 return joinPoint.proceed(); 57 } 58 59 }
1 @RestController 2 @Slf4j 3 @RequestMapping("/ftpConfiguration") 4 public class FtpConfigurationController { 5 6 @Autowired 7 FtpConfigurationService ftpConfigurationService; 8 9 @Autowired 10 FactorService factorService; 11 12 @SecurityAuth(roleName = "使用者角色") 13 @GetMapping("/page") 14 @ApiOperation("統計報表") 15 public Result<PageData<FtpConfigurationDto>> page(@ApiIgnore @RequestParam Map<String, Object> params) { 16 PageData<FtpConfigurationDto> page = ftpConfigurationService.page(params); 17 List<FtpConfigurationDto> list = page.getList(); 18 // 使用者密碼md5加密 19 list.forEach(item ->{ 20 try { 21 item.setPassword(DigestUtils.md5Hex(item.getPassword())); 22 } catch (Exception e) { 23 log.info("加密異常資訊:{}"+e.getMessage()); 24 } 25 }); 26 page.setList(list); 27 return new Result<PageData<FtpConfigurationDto>>().ok(page); 28 }