none
無法判斷上傳文檔的文件類型(ContentType 無效) RRS feed

  • 问题

  • 有一個頁面,客戶可以上傳txt文件和csv文件,但是不允許上傳其他的文件,就算把一個jpg文件改掉文件名為txt,也要職別出來,然後禁止上傳

    我用了三重判斷,關鍵代碼如下

     

    //獲取文件名稱的 Extension

    string extension = System.IO.Path.GetExtension(FileUpload1.FileName);

    //第一重判斷 ,根據Extension判斷

    if (extension != ".txt" && extension != ".csv")

    {

        Page.ClientScript.RegisterStartupScript(Page.GetType(), "noFile", "<script>alert(\"File  Extension is wrong\")</script> ");

        return;

    }

    //第二重判斷,根據 MIME

    if (FileUpload1.PostedFile.ContentType != "text/plain")

    {

        Page.ClientScript.RegisterStartupScript(Page.GetType(), "noFile", "<script>alert(\"File  Extension is wrong\")</script>");

        return;

    }

    try

    {

             Stream stream = FileUpload1.FileContent;

         StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);

        

        System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(stream);

    byte buffer = binaryReader.ReadByte();

    string fileclass = buffer.ToString();

    buffer = binaryReader.ReadByte();

    fileclass += buffer.ToString();

    //第三重判斷 :專門針對csv判斷, 等于 117115 说明 csv类型(txt文件沒有文件頭,無法判斷,所以此處只判斷 csv)

    if (fileclass != "117115" && extension == ".csv")

    {

    Page.ClientScript.RegisterStartupScript(Page.GetType(), "noFile", "<script>alert(\"File  Extension is wrong\")</script>");

    return;

    }

    }

    現在我頭痛的問題是,我把一個.jpg圖片文件的擴展後綴改為.txt,服務器就被騙過去了。用ContentType 也識別不出來,也被騙了

    要怎麼做才能讓頁面不被騙過去呢?

    2012年2月15日 8:15

全部回复

  • 不要依赖客户端发过来的信息,请求里的content type可以伪造的。你可以检查文件头是不是常见图片……



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年2月15日 15:59
    版主