最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Mvc中CommonsMultipartFile的特性實例詳解

 更新時間:2023年11月20日 15:30:59   作者:zpchcbd  
這篇文章主要給大家介紹了關(guān)于Spring?Mvc中CommonsMultipartFile特性的相關(guān)資料,SpringMVC擁有強大的靈活性,非侵入性和可配置性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言:

簡單的記錄下Spring <= 4.1.8的CommonsMultipartFile的特性,遇到一個springmvc的一套系統(tǒng)通過該方法進行繞過上傳解決,不過只限于windows的情況下,這篇筆記先介紹下關(guān)于CommonsMultipartFile,然后給出實例利用的情況

參考文章:https://forum.butian.net/share/815

MultipartFile是什么

在springmvc中進行文件上傳的時候,springmvc提供了兩個封裝好的上傳組件來進行使用,如下圖所示,分別是CommonsMultipartFile和StandardMultipartFile

StandardMultipartFile

pom.xml

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.8.RELEASE</version>
    </dependency>

如果要使用StandardServletMultipartResolver進行文件上傳,需要進行如下兩個步驟

先在springmvc-servlet.xml中配置如下multipartResolver為StandardServletMultipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />

然后在web.xml中還需要進行如下配置multipart-config,配置在DispatcherServlet的servlet標簽中

        <multipart-config>
            <!--上傳的文件的最大限制,單位byte-->
            <max-file-size>4194304</max-file-size>
            <!--multipart/form-data請求的最大限制,單位byte-->
            <max-request-size>10485760</max-request-size>
            <!--將存儲上載文件的目錄位置-->
            <!--<location></location>-->
        </multipart-config>

對于StandardMultipartFile類中有一個問題就是在獲取文件名的時候?qū)崿F(xiàn)的getOriginalFilename方法是直接獲取文件名,沒有進行過濾一些特殊字符的情況,這樣的情況就會產(chǎn)生安全問題比如路徑跳躍

UploadController.java

@Controller
public class UploadController {
    @RequestMapping(value = "/fileupload")
    @ResponseBody
    public String test(HttpServletRequest request) throws Exception {
        MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;
        MultipartFile file = req.getFile("uploadFile");
        String realFileName = file.getOriginalFilename();
        String ctxPath = req.getSession().getServletContext().getRealPath("/tmp/");
        File dirPath = new File(ctxPath);
        if (!dirPath.exists()) {
            dirPath.mkdir();
        }
        String serverPath = ctxPath + File.separator + realFileName;
        try {
            File uploadFile = new File(serverPath);
            FileCopyUtils.copy(file.getBytes(), uploadFile);
            return serverPath;
        } catch (Exception var9) {
            var9.printStackTrace();
            return "upload fail";
        }
    }
}

上面代碼的情況下,我們直接上傳文件的話會存在目錄跳躍的問題,結(jié)果如下所示,可以看到readme.jsp可以直接跳出tmp目錄

這里主要問題出在getOriginalFilename方法,這里可以觀察下StandardMultipartFile的getOriginalFilename,下面的圖中可以看到?jīng)]有對../這些符號做相關(guān)的限制

CommonsMultipartFile

pom.xml

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.8.RELEASE</version>
    </dependency>

這里可以將代碼改為CommonsMultipartFile來進行測試

將springmvc-servlet.xml中配置如下multipartResolver為CommonsMultipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

重新進行發(fā)包可以發(fā)現(xiàn)就不會出現(xiàn)目錄跳躍的問題了

這里同樣可以看下org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename,可以看到首先就會匹配/符號,然后取/之后的內(nèi)容

這里主要利用了org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename,而這里有個邏輯問題就是如果在windows下的話\\同樣可以作為分隔符來進行識別,所以如果對于/..\..\readme.jsp這種payload的話,那么在windows的情況下同樣可以進行利用

這邊拿windows的環(huán)境來進行測試,結(jié)果如下所示

調(diào)試過程可以看到org.springframework.web.multipart.commons.CommonsMultipartFile#getOriginalFilename最終取到的就是/之后的內(nèi)容

漏洞修復(fù)

這邊將pom.xml中的springmvc修改為4.1.9.RELEASE

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.9.RELEASE</version>
    </dependency>

重新測試的情況下,就無法進行繞過了

實戰(zhàn)遇到的代碼

這邊拿前面篇頭說的實際審計的情況,這個環(huán)境下是在/tmp/目錄下禁止訪問,所以如果要利用的話那么就需要上傳的文件不在該目錄下,那么這邊的話就可以用getOriginalFilename跨越目錄,用/..\..\readme.jsp來利用即可

    public static String upLoadFile(HttpServletRequest request) {
        MultipartHttpServletRequest req = (MultipartHttpServletRequest)request;
        MultipartFile file = req.getFile("uploadFile");
        String realFileName = file.getOriginalFilename();
        String ctxPath = request.getContextPath();
        ctxPath = req.getSession().getServletContext().getRealPath("/tmp/");
        File dirPath = new File(ctxPath);
        if (!dirPath.exists()) {
            dirPath.mkdir();
        }

        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        String serverPath = ctxPath + File.separator + format.format(new Date()) + realFileName;

        try {
            File uploadFile = new File(serverPath);
            FileCopyUtils.copy(file.getBytes(), uploadFile);
            return serverPath;
        } catch (Exception var9) {
            var9.printStackTrace();
            return null;
        }
    }

總結(jié)

到此這篇關(guān)于Spring Mvc中CommonsMultipartFile特性的文章就介紹到這了,更多相關(guān)Spring Mvc CommonsMultipartFile特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring boot中interceptor攔截器未生效的解決

    spring boot中interceptor攔截器未生效的解決

    這篇文章主要介紹了spring boot中interceptor攔截器未生效的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能

    SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能

    最近有一個需求是關(guān)于視頻上傳播放的,需要設(shè)計一個方案,中間談到了Minio這個技術(shù),于是來學習一下,所以本文給大家介紹了SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • java中File類應(yīng)用遍歷文件夾下所有文件

    java中File類應(yīng)用遍歷文件夾下所有文件

    這篇文章主要為大家詳細介紹了java中File類應(yīng)用遍歷文件夾下所有文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Springmvc如何實現(xiàn)向前臺傳遞數(shù)據(jù)

    Springmvc如何實現(xiàn)向前臺傳遞數(shù)據(jù)

    這篇文章主要介紹了Springmvc如何實現(xiàn)向前臺傳遞數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SWT(JFace)體驗之RowLayout布局

    SWT(JFace)體驗之RowLayout布局

    相對于FillLayout來說,RowLayout比較靈活,功能也比較強。用戶可以設(shè)置布局中子元素的大小、邊距、換行及間距等屬性。
    2009-06-06
  • Java防止短信盜刷和轟炸的解決方案

    Java防止短信盜刷和轟炸的解決方案

    短信盜刷和短信轟炸是項目開發(fā)中必須要解決的問題之一,它的優(yōu)先級不亞于 SQL 注入的問題,今天我們就來看下,如何防止這個問題,需要的朋友可以參考下
    2024-02-02
  • Java事務(wù)管理學習之Spring和Hibernate詳解

    Java事務(wù)管理學習之Spring和Hibernate詳解

    這篇文章主要給大家介紹了Java事務(wù)管理學習之Spring和Hibernate的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 淺談Java讀寫注冊表的方式Preferences與jRegistry

    淺談Java讀寫注冊表的方式Preferences與jRegistry

    這篇文章主要介紹了淺談Java讀寫注冊表的方式Preferences與jRegistry,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java基礎(chǔ)之java泛型通配符詳解

    Java基礎(chǔ)之java泛型通配符詳解

    Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制允許開發(fā)者在編譯時檢測到非法的類型,今天通過本文給大家介紹java泛型通配符的相關(guān)知識,感興趣的朋友一起看看吧
    2021-07-07
  • 詳解Mybatis Generator的具體使用教程

    詳解Mybatis Generator的具體使用教程

    Mybatis Generator可以幫助我們自動生成很多結(jié)構(gòu)化的代碼,比如每張表對應(yīng)的Entity、Mapper接口和Xml文件,可以省去很多繁瑣的工作,今天通過本文給大家介紹Mybatis Generator的具體使用教程,感興趣的朋友一起看看吧
    2022-02-02

最新評論

正镶白旗| 兴海县| 小金县| 同江市| 鹿泉市| 芦山县| 汤原县| 南溪县| 江口县| 大田县| 东台市| 池州市| 永定县| 明光市| 宜良县| 竹溪县| 台南县| 樟树市| 彭阳县| 宁化县| 垦利县| 宜黄县| 斗六市| 东乌珠穆沁旗| 兴安县| 沂水县| 大渡口区| 马关县| 白河县| 长海县| 建湖县| 东台市| 安图县| 绥芬河市| 黎城县| 太湖县| 浮山县| 阿图什市| 桦甸市| 乐都县| 曲松县|