1. 程式人生 > 其它 >記一次檔案上傳功能的審計

記一次檔案上傳功能的審計

1. 點選上傳頭像功能 抓取資料包  檢視 資源路徑 POST /dev-api/system/user/profile/avatar 

2. idea 檢索資源路徑  前端路徑 檢索到資料包 構造方法  。 後端專案檢索user/profile  檢索到頭像上傳功能點 程式碼

/**
* 頭像上傳
*/
@Log(title = "使用者頭像", businessType = BusinessType.UPDATE)
@PostMapping("/avatar")
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
{
if (!file.isEmpty())
{
LoginUser loginUser = getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
// 更新快取使用者頭像
loginUser.getUser().setAvatar(avatar);
tokenService.setLoginUser(loginUser);
return ajax;
}
}
return error("上傳圖片異常,請聯絡管理員");
}

先判斷檔案是否為空  。不為空則開始上傳檔案   發現使用  FileUploadUtils.upload()   上傳檔案  。 追蹤 upload()  函式   看具體實現

public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
InvalidExtensionException
{
int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
{
throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
}

assertAllowed(file, allowedExtension);

String fileName = extractFilename(file);

String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
file.transferTo(Paths.get(absPath));
return getPathFileName(baseDir, fileName);
}

發現使用  allowedExtension () 校驗字尾名。  繼續追蹤 

public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
throws FileSizeLimitExceededException, InvalidExtensionException
{
long size = file.getSize();
if (size > DEFAULT_MAX_SIZE)
{
throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
}

String fileName = file.getOriginalFilename();
String extension = getExtension(file);
if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
{
if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
{
發現 使用 isAllowedExtension()判斷副檔名 邏輯是 與允許的副檔名不相等 便報錯 。
public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
{
for (String str : allowedExtension)
{
if (str.equalsIgnoreCase(extension))
{
return true;
}
}
return false;
}

返回檔名的 也已經 重新命名為指定格式。 上傳頭像 功能點 安全。