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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- springboot+wangEditor圖片上傳Spring Boot
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- Springboot +redis+⾕歌開源Kaptcha實現圖片驗證碼功能Spring BootRedisAPT
- mino如何上傳同名的圖片
- 【六褘-Java】 SpringBoot整合JWT實現token驗證的流程圖;使用者訪問某個資源的流程圖JavaSpring BootJWT流程圖
- 上傳圖片
- app直播原始碼,js實現上傳圖片型別+大小+尺寸驗證APP原始碼JS型別
- PbootCMS上傳圖片變模糊、上傳圖片尺寸受限的解決方案boot
- electron上傳圖片
- 上傳圖片jsJS
- 裁剪上傳圖片
- 圖片上傳及圖片處理
- 圖片驗證碼 CaptchaAPT
- 圖片驗證碼介面
- 點選驗證圖片
- 滑塊驗證圖片
- 旋轉圖片驗證
- SpringBoot + Spring Security 學習筆記(三)實現圖片驗證碼認證Spring Boot筆記
- topthink人物資訊中的封面圖片上傳。。。。
- 拖拽上傳如何獲取到圖片的base64
- 多圖片formpost上傳ORM
- spring boot 圖片上傳Spring Boot
- 測試圖片上傳
- input file圖片上傳
- 本地Markdown上傳圖片
- golang 生成圖片驗證碼Golang
- ci框架中的圖片上傳框架
- 基於SpringMVC的上傳圖片SpringMVC
- 基於WebUploader的圖片上傳Web
- 上傳圖片 以及做成縮圖
- vue 上傳圖片進行壓縮圖片Vue
- Ueditor 上傳圖片自動新增水印(只能上傳圖片,上傳檔案報錯)
- 如何透過 wireshark 捕獲 C# 上傳的圖片C#
- Springboot+bootstrap介面版之增刪改查及圖片上傳Spring Boot
- Java實現圖片上傳到伺服器,並把上傳的圖片讀取出來Java伺服器
- SpringBoot-表單驗證-統一異常處理-自定義驗證資訊源Spring Boot
- js上傳圖片壓縮JS
- 圖片上傳方案詳解