對上傳的圖片進行格式校驗以及安全性校驗


對上傳的圖片進行格式校驗以及安全性校驗

圖片上傳服務器后,需要對其進行安全校驗

判斷上傳的是否是圖片

通過后綴名進行判斷

  • 最基本的校驗:校驗文件的后綴名是否符合要求的格式。
  • 這種非常的不靠譜,完全可以修改文件的后綴名繞過檢驗。
public static bool CheckUpLoadFileExtension(string fileName)
{
    string fileExtension = System.IO.Path.GetExtension(fileName).Trim().ToLower();

    // 允許的文件后綴
    HashSet<string> hs = new HashSet<string> { ".bmp", ".gif", ".png", ".jpeg", ".jpg" };

    return hs.Contains(fileExtension);
}

通過文件頭

  • 圖片文件在頭部信息 (一般都會在圖片文件最開始的幾個字節) 中都會包含圖片的格式信息
/// <summary>
/// 圖片類型幫助類
/// </summary>
public class ImageFormatHelper
{

    /// <summary>
    /// 獲取圖片類型
    /// </summary>
    /// <param name="bytes"></param>
    /// <returns></returns>
    public static PictureFormat GetPictureFormat(byte[] bytes)
    {
        if (bytes == null || bytes.Length < 2)
        {
            return PictureFormat.UNKNOWN;
        }

        if (Enum.TryParse($"{bytes[0]}{bytes[1]}", out PictureFormat format))
        {
            if (Enum.IsDefined(typeof(PictureFormat), format))
            {
                return format;
            }
        }

        return PictureFormat.UNKNOWN;
    }


    public enum PictureFormat
    {
        BMP = 6677,
        GIF = 7173,
        WEBP = 8273,
        PNG = 13780,
        JPG = 255216,
        UNKNOWN = 0
    }

}

// 判斷圖片類型
PictureFormat imageFormat = ImageFormatHelper.GetPictureFormat(uploadFileBytes);

if (imageFormat != PictureFormat.GIF
    && imageFormat != PictureFormat.JPG
    && imageFormat != PictureFormat.PNG)
{
    result = $"圖片格式為 {imageFormat} ,請重新上傳";
    return result;
}

通過 ImageIO 判斷

  • 通過數據流創建 Image 對象,能夠正常創建對象。
  • 如果是 webp 圖片, 使用 Image.FromStream 讀取圖片會發生異常。
System.Drawing.Image MyImage = System.Drawing.Image.FromStream(file.InputStream);

圖片文件的安全檢查處理

通過上面的方法,確認上傳的文件是圖片了,但是如果在可以正常打開的圖片里面加入非法代碼或者病毒,那就非常危險了。

那么怎么可以預防這種情況,既能夠正常打開,又能獲取圖片的寬高等屬性,可以對圖片進行重寫,新生成的圖片不會有這種惡意代碼了。

給圖片加水印

可以將透明度調為0,乍一看跟原圖一樣,其實不是上面的那張原圖了

備注

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM