首页 > 其他分享 >记一次文件上传功能的审计

记一次文件上传功能的审计

时间:2022-12-08 18:55:36浏览次数:30  
标签:审计 文件 return String allowedExtension avatar file 上传

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;
}

返回文件名的 也已经 重命名为指定格式。 上传头像 功能点 安全。

 

标签:审计,文件,return,String,allowedExtension,avatar,file,上传
From: https://www.cnblogs.com/darkfree/p/16966989.html

相关文章

  • 完全参考java8的开发文档写的文件读写
    publicstaticvoidmain(String[]args)throwsIOException{Stringpath="D:\\project\\luotuo-server\\src\\test\\java\\com\\manageSystem\\project......
  • go 不保存文件下载
    xlsxNews:=excelize.NewFile()xlsxNews.SetSheetRow("sheet1","A1",&[]interface{}{"publishDate","newsId","title"},)r.Response.Header().Set("Content......
  • php 大文件分片上传处理
    ​ 核心原理: 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。* 如何分片;* 如何合成......
  • 关于如何获取.jsp文件中已经展示的信息
    在进行信息删除操作(假设通过ID进行删除)的时候,如果在真正进行删除之前展示即将被删除的信息进行最终删除确认,那么跳转到相应的.jsp文件之后就会丢失ID信息(即,系统无法再获取......
  • Go--解析yaml文件
    yaml文件是目前最常用的配置文件,使用go语言编写代码和工具时,也会用到yaml文件,将服务配置及中间件等信息定义到yaml文件中,后续可根据实际场景来选用。//先下载外部包go......
  • 读取yaml文件
    1、nmb.yaml  2、获取yaml数据 ......
  • 实现在windows、linux下上传ios app到App Store​
     我们知道发布一个app,一般是用到苹果的applicationloader助手上传应用,用过的都知道使用起来很繁琐,经常出错。而且只能运行在mac系统上,需要一定的硬件条件。​  前......
  • 读取配置文件.ini
    1、config.ini文件 [log]name=py30level=INFO[mysql]username=pythonpasswd=1234562、读取ini配置文件数据(conf.py)"""#格式[section]--区域option=value--属性"""......
  • C# 创建文件到共享目录 C# create file to share folder
    try{//MapadriveSystem.Diagnostics.Process.Start(@"C:\WINDOWS\system32\net.exe",......
  • 您上传的 APK 或 Android App Bundle 内含活动、活动别名、服务或广播接收器,这些项目
    您上传的APK或AndroidAppBundle内含活动、活动别名、服务或广播接收器,这些项目有intent过滤器,但没有“android:exported”属性设置。此文件无法在Android12或更......