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 也識別不出來,也被騙了

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

    • 已移动 ThankfulHeart 2012年2月15日 8:31 判断上传文件ASP.NET (发件人:.NET Framework 一般性问题讨论区)
    2012年2月15日 8:08

全部回复

  • 看到有一篇文章也遇到類似問題

    http://www.cnblogs.com/criedshy/archive/2010/05/24/1742918.html

    但是我對他的原理“把给定的那个文件看作是无类型的二进制文件,然后顺序地读出这个文件的每一个字节,如果文件里有一个字节的值等于0,那么这个文件就不是文本文件;反之,如果这个文件中没有一个字节的值是0的话,就可以判定这个文件是文本文件了。”感到奇怪。貌似這種算法不夠嚴謹,請問有誰能指點我一下嗎

    小女子在此謝過各位了!

    2012年2月15日 9:47