SpringBoot如何驗證使用者上傳的圖片資源
允許使用者上傳圖片資源(頭像,發帖)是APP常見的需求,特別需要把使用者的資源IO到磁碟情況下,需要防止壞人提交一些非法的檔案,例如木馬,web ,可執行程式等等。這類非法檔案不僅會導致客戶端圖片資源顯示失敗,而且還會給伺服器帶來安全問題。
透過檔案字尾判斷檔案的合法性
這種方式比較常見,也很簡單,是目前大多數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 "檔案字尾不能為空"; } // 允許上傳的檔案字尾列表 SetallowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif")); if (!allowSuffix.contains(suffix.toLowerCase())) { return "非法的檔案,不允許的檔案型別:" + suffix; } // 序列化到磁碟中的檔案上傳目錄, /upload // FileCopyUtils.copy 方法會自動關閉流資源 FileCopyUtils.copy(multipartFile.getInputStream(), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW)); // 返回相對訪問路徑,檔名極有可能帶中文或者空格等字元,進行uri編碼 return "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8); }
使用 ImageIO 判斷是否是圖片
這個方法就比較嚴格了,在判斷字尾的基礎上,使用Java的ImageIO類去載入圖片,嘗試讀取其寬高資訊,如果不是合法的圖片資源。則無法讀取到這兩個資料。就算是把非法檔案修改了字尾,也可以檢測出來。
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 "檔案字尾不能為空"; } // 允許上傳的檔案字尾列表 SetallowSuffix = 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 "檔案不是圖片檔案"; } // 複製到到上傳目錄 FileCopyUtils.copy(new FileInputStream(tempFile), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW)); // 返回相對訪問路徑 return "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8); } finally { // 響應客戶端後,始終刪除臨時檔案 tempFile.delete(); } }
總結
使用ImageIo的方式更為保險,但是需要多幾次IO操作。比較消耗效能。而且今天APP大都是用雲端儲存服務,類似於阿里雲的OSS。直接就把客戶端上傳的檔案PUT到了雲端,才不管使用者上傳的圖片是不是真正的圖片,非法上傳,最多導致客戶端不能顯示而已,但是威脅不了伺服器的安全。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2795485/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javascript圖片上傳格式尺寸等特徵驗證效果JavaScript特徵
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- mino如何上傳同名的圖片
- springboot+wangEditor圖片上傳Spring Boot
- Springboot +redis+⾕歌開源Kaptcha實現圖片驗證碼功能Spring BootRedisAPT
- js驗證上傳圖片副檔名型別程式碼例項JS型別
- 上傳圖片
- js如何限定圖片上傳的型別JS型別
- app直播原始碼,js實現上傳圖片型別+大小+尺寸驗證APP原始碼JS型別
- Retrofit+RxJava上傳圖片上傳圖片到後臺RxJava
- 圖片上傳-下載-刪除等圖片管理的若干經驗總結
- 【easyui 】上傳圖片UI
- 上傳圖片jsJS
- PbootCMS上傳圖片變模糊、上傳圖片尺寸受限的解決方案boot
- 圖片上傳及圖片處理
- 【六褘-Java】 SpringBoot整合JWT實現token驗證的流程圖;使用者訪問某個資源的流程圖JavaSpring BootJWT流程圖
- curl上傳圖片的大坑
- 圖片驗證碼 CaptchaAPT
- 圖片驗證碼介面
- 圖片上傳-下載-刪除等圖片管理的若干經驗總結2
- js如何檢測上傳圖片的字尾格式JS
- php圖片上傳之圖片轉換PHP
- 多圖片formpost上傳ORM
- input file圖片上傳
- PHP上傳圖片類PHP
- 圖片檔案上傳
- 測試圖片上傳
- js封裝,常用ajax刪除和手機驗證,上傳圖片的方法,基於layerJS封裝
- ci框架中的圖片上傳框架
- golang 生成圖片驗證碼Golang
- C#圖片驗證碼C#
- 基於Ajax的formData圖片和資料上傳ORM
- vue 上傳圖片進行壓縮圖片Vue
- 如何透過 wireshark 捕獲 C# 上傳的圖片C#
- Ueditor 上傳圖片自動新增水印(只能上傳圖片,上傳檔案報錯)
- 學姐,影片上傳不了,我上傳了圖片
- [開源專案] Laravel 圖片上傳元件,支援直傳雲端儲存Laravel元件
- Java實現圖片上傳到伺服器,並把上傳的圖片讀取出來Java伺服器