国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

10-java實現(xiàn)對上傳文件做安全性檢查

這篇具有很好參考價值的文章主要介紹了10-java實現(xiàn)對上傳文件做安全性檢查。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

對外接口支持文件上傳功能時,為避免有人惡意上傳有毒或者篡改程序的腳本,需要對上傳的文件添加安全性校驗。

1.文件后綴校驗

文件首先校驗直觀文件上傳格式,校驗文件后綴是否符合業(yè)務(wù)要求。以MultipartFile類為例

        String fileName = file.getOriginalFilename();
        if (Strings.isEmpty(fileName)) {
            throw new RuntimeException("文件名未找到");
        }
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!Objects.equal(suffix, "xls") && !Objects.equal(suffix, "xlsx")) {
            throw new RuntimeException("文件類型不正確,需要為xls或者xlsx");
        }

2.校驗文件頭

由于文件后綴可能涉及到篡改的情況出現(xiàn),因此需要校驗文件的魔數(shù),也就是文件頭。無論這個文件是否修改文件后綴,這個文件的文件頭是不會改變的。下面是常用的文件頭格式:

1.使用枚舉類去校驗

JPEG (jpg),文件頭:FFD8FFE1
PNG (png),文件頭:89504E47
GIF (gif),文件頭:47494638
TIFF (tif),文件頭:49492A00
Windows Bitmap (bmp),文件頭:424D
CAD (dwg),文件頭:41433130
Adobe Photoshop (psd),文件頭:38425053
Rich Text Format (rtf),文件頭:7B5C727466
XML (xml),文件頭:3C3F786D6C
HTML (html),文件頭:68746D6C3E
Email [thorough only] (eml),文件頭:44656C69766572792D646174653A
Outlook Express (dbx),文件頭:CFAD12FEC5FD746F
Outlook (pst),文件頭:2142444E
MS Word/Excel (xls.or.doc),文件頭:D0CF11E0
MS Access (mdb),文件頭:5374616E64617264204A
WordPerfect (wpd),文件頭:FF575043
Postscript (eps.or.ps),文件頭:252150532D41646F6265
Adobe Acrobat (pdf),文件頭:255044462D312E
Quicken (qdf),文件頭:AC9EBD8F
Windows Password (pwl),文件頭:E3828596
ZIP Archive (zip),文件頭:504B0304
RAR Archive (rar),文件頭:52617221
Wave (wav),文件頭:57415645
AVI (avi),文件頭:41564920
Real Audio (ram),文件頭:2E7261FD
Real Media (rm),文件頭:2E524D46
MPEG (mpg),文件頭:000001BA
MPEG (mpg),文件頭:000001B3
Quicktime (mov),文件頭:6D6F6F76
Windows Media (asf),文件頭:3026B2758E66CF11
MIDI (mid),文件頭:4D546864

使用上面的文件頭去校驗的代碼示例(這段代碼參考:Java 實戰(zhàn)系列·Magic 魔數(shù)獲取文件類型):

1.魔數(shù)枚舉類

public enum FileType {
    /**
     * JPEG
     */
    JPEG("JPEG", "FFD8FF"),

    /**
     * PNG
     */
    PNG("PNG", "89504E47"),

    /**
     * GIF
     */
    GIF("GIF", "47494638"),

    /**
     * TIFF
     */
    TIFF("TIFF", "49492A00"),

    /**
     * Windows bitmap
     */
    BMP("BMP", "424D"),

    /**
     * CAD
     */
    DWG("DWG", "41433130"),

    /**
     * Adobe photoshop
     */
    PSD("PSD", "38425053"),

    /**
     * Rich Text Format
     */
    RTF("RTF", "7B5C727466"),

    /**
     * XML
     */
    XML("XML", "3C3F786D6C"),

    /**
     * HTML
     */
    HTML("HTML", "68746D6C3E"),

    /**
     * Outlook Express
     */
    DBX("DBX", "CFAD12FEC5FD746F "),

    /**
     * Outlook
     */
    PST("PST", "2142444E"),

    /**
     * doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db
     */
    OLE2("OLE2", "0xD0CF11E0A1B11AE1"),

    /**
     * Microsoft Word/Excel
     */
    XLS_DOC("XLS_DOC", "D0CF11E0"),

    /**
     * Microsoft Access
     */
    MDB("MDB", "5374616E64617264204A"),

    /**
     * Word Perfect
     */
    WPB("WPB", "FF575043"),

    /**
     * Postscript
     */
    EPS_PS("EPS_PS", "252150532D41646F6265"),

    /**
     * Adobe Acrobat
     */
    PDF("PDF", "255044462D312E"),

    /**
     * Windows Password
     */
    PWL("PWL", "E3828596"),

    /**
     * ZIP Archive
     */
    ZIP("ZIP", "504B0304"),

    /**
     * ARAR Archive
     */
    RAR("RAR", "52617221"),

    /**
     * WAVE
     */
    WAV("WAV", "57415645"),

    /**
     * AVI
     */
    AVI("AVI", "41564920"),

    /**
     * Real Audio
     */
    RAM("RAM", "2E7261FD"),

    /**
     * Real Media
     */
    RM("RM", "2E524D46"),

    /**
     * Quicktime
     */
    MOV("MOV", "6D6F6F76"),

    /**
     * Windows Media
     */
    ASF("ASF", "3026B2758E66CF11"),

    /**
     * MIDI
     */
    MID("MID", "4D546864");

    private String key;
    private String value;

    FileType(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getValue() {
        return value;
    }
    public String getKey() {
        return key;
    }
}

2.獲取文件頭,并校驗是否為Excel

public class FileUtil {

    /**
     * 獲取文件投
     *
     * @param filePath 文件路徑
     * @return 16 進(jìn)制的文件投信息
     *
     * @throws IOException
     */
    private static String getFileHeader(String filePath) throws IOException {
        byte[] b = new byte[28];
        InputStream inputStream = new FileInputStream(filePath);
        inputStream.read(b, 0, 28);
        inputStream.close();
        return bytes2hex(b);
    }

    /**
     * 將字節(jié)數(shù)組轉(zhuǎn)換成16進(jìn)制字符串
     */
    private static String bytes2hex(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (byte b : src) {
            int v = b & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 校驗是否為excel
     *
     * @param filePath 文件路徑
     * @return 文件類型
     *
     * @throws IOException
     */
    public static boolean checkIsExcel(String filePath) throws IOException {
        String fileHead = getFileHeader(filePath);
        if (null == fileHead || fileHead.length() == 0) {
            return false;
        }
        //校驗是否為xls或者xlsx文件
        if (Objects.equal(fileHead, FileType.OLE2.getValue()) || Objects.equal(fileHead, FileType.XLS_DOC.getValue())) {
            return true;
        }
        return false;
    }
}

除了用上面的魔數(shù)頭去校驗,也可以用poi提供的枚舉類FileMagic工具類去校驗:

2.FileMagic校驗文件頭

FileMagic魔數(shù)值解釋:

    OLE2(-2226271756974174256L),   //xls
    OOXML(new int[]{80, 75, 3, 4}), //xlsx, OOXML全稱是Office Open XML,OOXML是由微軟公司為Office 2007產(chǎn)品開發(fā)的技術(shù)規(guī)范,現(xiàn)已成為國際文檔格式標(biāo)準(zhǔn),兼容前國際標(biāo)準(zhǔn)ODF(Open Document Format)和中國文檔標(biāo)準(zhǔn)UOF(Unified Office document Format)。
    XML(new int[]{60, 63, 120, 109, 108}),  //xml
    BIFF2(new int[]{9, 0, 4, 0, 0, 0, 63, 0}), //Excel 2 現(xiàn)在office已經(jīng)不支持
    BIFF3(new int[]{9, 2, 6, 0, 0, 0, 63, 0}),//Excel 3現(xiàn)在office已經(jīng)不支持
    BIFF4(new byte[][]{{9, 4, 6, 0, 0, 0, 63, 0}, {9, 4, 6, 0, 0, 0, 0, 1}}),//Excel 4 現(xiàn)在office已經(jīng)不支持
    MSWRITE(new byte[][]{{49, -66, 0, 0}, {50, -66, 0, 0}}),  //微軟原來的寫入流,這個不清楚是否還能使用。
    RTF(new String[]{"{\\rtf"}),  //rtf
    PDF(new String[]{"%PDF"}), //pdf
    HTML(new String[]{"<!DOCTYP", "<html", "\n\r<html", "\r\n<html", "\r<html", "\n<html", "<HTML", "\r\n<HTML", "\n\r<HTML", "\r<HTML", "\n<HTML"}),  //HTML
    WORD2(new int[]{219, 165, 45, 0}),//word
    JPEG(new byte[][]{{-1, -40, -1, -37}, {-1, -40, -1, -32, 63, 63, 74, 70, 73, 70, 0, 1}, {-1, -40, -1, -18}, {-1, -40, -1, -31, 63, 63, 69, 120, 105, 102, 0, 0}}),//圖片驗證,jpeg格式
    GIF(new String[]{"GIF87a", "GIF89a"}),//圖片驗證,gif格式
    PNG(new int[]{137, 80, 78, 71, 13, 10, 26, 10}),//圖片驗證,png格式
    TIFF(new String[]{"II*\u0000", "MM\u0000*"}),//圖片驗證,tiff格式
    WMF(new int[]{215, 205, 198, 154}),//圖片驗證,wmf格式
    EMF(new int[]{1, 0, 0, 0, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 32, 69, 77, 70}),//圖片驗證,emf格式
    BMP(new int[]{66, 77}),//圖片驗證,nmp格式
    UNKNOWN(new byte[][]{new byte[0]});//未知魔數(shù)

使用魔數(shù)校驗Excel文件代碼:

 private static boolean checkIsExcel(InputStream inputStream) throws IOException {
 	//獲取文件流的文件頭
     FileMagic fileMagic = FileMagic.valueOf(inputStream);
     //判斷Excel文件頭是否符合xls或者xlsx
     if (Objects.equal(fileMagic, FileMagic.OLE2) || Objects.equal(fileMagic, FileMagic.OOXML)) {
         return true;
     }
     return false;
 }

3.校驗文件大小

為了避免上傳過大文件,影響服務(wù)器性能以及帶寬。需要對文件大小進(jìn)行校驗,具體文件大小控制以業(yè)務(wù)為主。

4.示例

以校驗Excel文件為例:文章來源地址http://www.zghlxwxcb.cn/news/detail-441763.html

 /**
     * 校驗文件
     *
     * @param file 文件
     * @param fileMaxSize  文件大小限制
     */
    public static void checkExcel(MultipartFile file, Double fileMaxSize) {
        // 文件類型判斷 - 校驗文件后綴
        String fileName = file.getOriginalFilename();
        if (Strings.isEmpty(fileName)) {
            throw new RuntimeException("文件名未找到");
        }
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!Objects.equal(suffix, "xls") && !Objects.equal(suffix, "xlsx")) {
            throw new RuntimeException("文件類型不正確,需要為xls或者xlsx");
        }

        // 文件類型判斷 - 校驗文件頭內(nèi)容
        try (InputStream inputStream = file.getInputStream()) {
            // 獲取到上傳文件的文件頭信息
            boolean isExcel = checkIsExcel(inputStream);
            if (!isExcel) {
                throw new RuntimeException("文件類型不正確,原文件類型需要為xls");
            }
        } catch (IOException e) {
            log.error("Get file input stream failed.", e);
            throw new RuntimeException("文件上傳失敗");
        }

        // 文件大小校驗 - 單位:MB
        long fileBytes = file.getSize();
        double fileSize = (double) fileBytes / 1048576;
        if (fileSize <= 0) {
            throw new RuntimeException("文件內(nèi)容為空");
        }
        if (fileSize > fileMaxSize) {
            throw new RuntimeException("文件上傳內(nèi)容大小超出限制");
        }
    }

    /**
     * 校驗文件頭
     *
     * @param inputStream
     * @return
     *
     * @throws IOException
     */
    private static boolean checkIsExcel(InputStream inputStream) throws IOException {
        FileMagic fileMagic = FileMagic.valueOf(inputStream);
        if (Objects.equal(fileMagic, FileMagic.OLE2) || Objects.equal(fileMagic, FileMagic.OOXML)) {
            return true;
        }
        return false;
    }

到了這里,關(guān)于10-java實現(xiàn)對上傳文件做安全性檢查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 商用密碼應(yīng)用安全性評估----技術(shù)層面實現(xiàn)

    網(wǎng)絡(luò)和通信安全 ? ???? 三個密碼產(chǎn)品 ?SSL VPN IPSEC VPN? 安全認(rèn)證網(wǎng)關(guān)-----數(shù)字證書---雙證書-----SM2簽名 ?SM4加密 ??D 是否使用這些安全產(chǎn)品? ?A用的算法是否符合國家密碼算法要求?????? K密鑰管理是否安全(商用密碼產(chǎn)品檢測中心認(rèn)證的) ????? 對象:一般劃分根據(jù)

    2024年02月16日
    瀏覽(22)
  • Java應(yīng)用服務(wù)系統(tǒng)安全性,簽名和驗簽淺析

    Java應(yīng)用服務(wù)系統(tǒng)安全性,簽名和驗簽淺析

    隨著互聯(lián)網(wǎng)的普及,分布式服務(wù)部署越來越流行,服務(wù)之間通信的安全性也是越來越值得關(guān)注。這里,筆者把應(yīng)用與服務(wù)之間通信時,進(jìn)行的的安全性相關(guān), 加簽 與 驗簽 ,進(jìn)行了一個簡單的記錄。 網(wǎng)關(guān)服務(wù)接口,暴漏在公網(wǎng),被非法調(diào)用? 增加了token安全驗證,被抓包等

    2024年02月13日
    瀏覽(23)
  • 【Linux命令詳解 | chmod命令】 chmod命令用于修改文件或目錄的權(quán)限,保護文件安全性。

    【Linux命令詳解 | chmod命令】 chmod命令用于修改文件或目錄的權(quán)限,保護文件安全性。

    在Ubuntu系統(tǒng)中, chmod 命令是一個強大的工具,用于修改文件或目錄的權(quán)限,從而保護文件的安全性。通過適當(dāng)配置權(quán)限,可以控制哪些用戶或用戶組可以訪問、讀取、寫入或執(zhí)行特定文件或目錄。 chmod 命令是Linux/Unix系統(tǒng)中的基礎(chǔ)命令之一,對于系統(tǒng)管理員和開發(fā)者來說都是

    2024年02月12日
    瀏覽(774)
  • java生成一個符合密碼學(xué)和安全性的隨機秘鑰

    有時 我們在生成token 或者完成某種加密形式時會需要一個秘鑰 但是 有些時候 項目開發(fā)并沒有規(guī)定用什么秘鑰 但是 秘鑰都是要有一定格式規(guī)范的 我們可以通過以下代碼生成一個隨機秘鑰 重點是 這種一定會符合密碼學(xué)和安全規(guī)范

    2024年02月07日
    瀏覽(19)
  • PHP+SQL考勤系統(tǒng)安全性的設(shè)計與實現(xiàn)

    第一章 概 述 1.1? PHP的概念 PHP: Hypertext Preprocessor ( 超文本預(yù)處理器 ) 的縮寫,它是一種服務(wù)器端的 HTML 腳本 / 編程語言 , 是一種簡單的、 面向?qū)ο?的、解釋型的、健壯的、安全的、性能非常之高的、獨立于架構(gòu)的、可移植的、動態(tài)的腳本語言

    2023年04月08日
    瀏覽(22)
  • 云計算與大數(shù)據(jù)平臺:實現(xiàn)高度安全性的關(guān)鍵技術(shù)

    云計算和大數(shù)據(jù)平臺在現(xiàn)代信息技術(shù)中扮演著越來越重要的角色。隨著數(shù)據(jù)的產(chǎn)生和傳輸量日益增加,數(shù)據(jù)安全和系統(tǒng)安全成為了企業(yè)和個人最關(guān)注的問題。本文將從云計算與大數(shù)據(jù)平臺的角度,深入探討實現(xiàn)高度安全性的關(guān)鍵技術(shù)。 云計算是一種基于互聯(lián)網(wǎng)的計算資源共享

    2024年04月27日
    瀏覽(26)
  • WebSocket與Shiro認(rèn)證信息傳遞的實現(xiàn)與安全性探討

    在現(xiàn)代Web應(yīng)用程序中,WebSocket已經(jīng)成為實時雙向通信的重要組件。而Shiro作為一個強大的Java安全框架,用于處理身份驗證、授權(quán)和會話管理。本文將探討如何通過WebSocket與Shiro集成,實現(xiàn)認(rèn)證信息的傳遞,并關(guān)注在這一過程中確保安全性的關(guān)鍵考慮因素。 步驟概述 WebSocket連接

    2024年01月25日
    瀏覽(16)
  • 如何使用Flask-Login來實現(xiàn)用戶身份驗證和安全性?

    當(dāng)你想要在你的Flask應(yīng)用中實現(xiàn)用戶身份驗證和安全性時,F(xiàn)lask-Login這個擴展將會是你的最佳伙伴。它提供了一組簡單而強大的工具來處理用戶登錄、注銷和其他安全相關(guān)的操作。下面,我將以一個新手的角度,用盡可能輕松的語氣來解釋如何使用Flask-Login。 首先,你需要在你

    2024年02月15日
    瀏覽(26)
  • C++中的網(wǎng)絡(luò)編程和安全性:實現(xiàn)安全的Web應(yīng)用程序和網(wǎng)絡(luò)應(yīng)用程序

    作者:禪與計算機程序設(shè)計藝術(shù) 《67. C++中的網(wǎng)絡(luò)編程和安全性:實現(xiàn)安全的Web應(yīng)用程序和網(wǎng)絡(luò)應(yīng)用程序》 1.1. 背景介紹 隨著互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)絡(luò)應(yīng)用程序在人們的生活和工作中扮演著越來越重要的角色,網(wǎng)絡(luò)編程和安全性也成為了現(xiàn)代應(yīng)用程序的重要組成部分。在網(wǎng)絡(luò)

    2024年02月16日
    瀏覽(25)
  • 加密數(shù)據(jù)安全性的兩大安全護盾-前向安全性與后向安全性詳解

    在數(shù)字安全的世界里,加密技術(shù)是用來保護數(shù)據(jù)不被未經(jīng)授權(quán)訪問的重要機制。然而,即使使用了最強的加密算法,也不能保證永遠(yuǎn)是安全的。攻擊者可能會在未來某個時間點獲得了解密密鑰,從而能夠解密攔截的密文。為了解決這個問題,密碼學(xué)引入了前向安全性(Forwar

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包