SpringBoot中驗證用戶上傳的圖片資源的方法
允許用戶上傳圖片資源(頭像,發(fā)帖)是APP常見的需求,特別需要把用戶的資源IO到磁盤情況下,需要防止壞人提交一些非法的文件,例如木馬,webshell,可執(zhí)行程序等等。這類非法文件不僅會導(dǎo)致客戶端圖片資源顯示失敗,而且還會給服務(wù)器帶來安全問題。
通過文件后綴判斷文件的合法性
這種方式比較常見,也很簡單,是目前大多數(shù)APP選擇的做法。
public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {
// 原始文件名稱
String fileName = multipartFile.getOriginalFilename();
// 解析到文件后綴,判斷是否合法
int index = fileName.lastIndexOf(".");
String suffix = null;
if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {
return "文件后綴不能為空";
}
// 允許上傳的文件后綴列表
Set<String> allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));
if (!allowSuffix.contains(suffix.toLowerCase())) {
return "非法的文件,不允許的文件類型:" + suffix;
}
// 序列化到磁盤中的文件上傳目錄, /upload
// FileCopyUtils.copy 方法會自動關(guān)閉流資源
FileCopyUtils.copy(multipartFile.getInputStream(), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));
// 返回相對訪問路徑,文件名極有可能帶中文或者空格等字符,進行uri編碼
return "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
}
使用 ImageIO 判斷是否是圖片
這個方法就比較嚴格了,在判斷后綴的基礎(chǔ)上,使用Java的ImageIO類去加載圖片,嘗試讀取其寬高信息,如果不是合法的圖片資源。則無法讀取到這兩個數(shù)據(jù)。就算是把非法文件修改了后綴,也可以檢測出來。
public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {
// 原始文件名稱
String fileName = multipartFile.getOriginalFilename();
// 解析到文件后綴
int index = fileName.lastIndexOf(".");
String suffix = null;
if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {
return "文件后綴不能為空";
}
// 允許上傳的文件后綴列表
Set<String> allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));
if (!allowSuffix.contains(suffix.toLowerCase())) {
return "非法的文件,不允許的文件類型:" + suffix;
}
// 臨時文件
File tempFile = new File(System.getProperty("java.io.tmpdir"), fileName);
try {
// 先把文件序列化到臨時目錄
multipartFile.transferTo(tempFile);
try {
// 嘗試IO文件,判斷文件的合法性
BufferedImage bufferedImage = ImageIO.read(tempFile);
bufferedImage.getWidth();
bufferedImage.getHeight();
} catch (Exception e) {
// IO異常,不是合法的圖片文件,返回異常信息
return "文件不是圖片文件";
}
// 復(fù)制到到上傳目錄
FileCopyUtils.copy(new FileInputStream(tempFile), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));
// 返回相對訪問路徑
return "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);
} finally {
// 響應(yīng)客戶端后,始終刪除臨時文件
tempFile.delete();
}
}
總結(jié)
使用ImageIo的方式更為保險,但是需要多幾次IO操作。比較消耗性能。而且今天APP大都是用云存儲服務(wù),類似于阿里云的OSS。直接就把客戶端上傳的文件PUT到了云端,才不管用戶上傳的圖片是不是真正的圖片,非法上傳,最多導(dǎo)致客戶端不能顯示而已,但是威脅不了服務(wù)器的安全。
原文:https://springboot.io/t/topic/2231
到此這篇關(guān)于在SpringBoot中驗證用戶上傳的圖片資源的文章就介紹到這了,更多相關(guān)SpringBoot驗證用戶上傳的圖片資源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
劍指Offer之Java算法習(xí)題精講數(shù)組與字符和等差數(shù)列
跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03
mybatis多對多關(guān)聯(lián)實戰(zhàn)教程(推薦)
下面小編就為大家?guī)硪黄猰ybatis多對多關(guān)聯(lián)實戰(zhàn)教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Java數(shù)據(jù)結(jié)構(gòu)之有向圖的拓撲排序詳解
這篇文章主要為大家詳細介紹了Java數(shù)據(jù)結(jié)構(gòu)中有向圖的拓撲排序,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下2022-11-11
深入理解springboot中配置文件application.properties
本文主要介紹了springboot中配置文件application.properties,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Java中的異常處理(try,catch,finally,throw,throws)
本文主要介紹了Java中的異常處理,文章主要介紹的異常處理包括5個關(guān)鍵字try,catch,finally,throw,throws,更多詳細內(nèi)容需要的朋友可以參考一下2022-06-06

