C#でファイルの拡張子を見つける方法


135

私のWebアプリケーション(asp.net、c#)では、ページにビデオファイルをアップロードしていますが、flvビデオのみをアップロードしたいと思います。他の拡張機能動画をアップロードするときに制限するにはどうすればよいですか?


1
可能であれば、不要なアップロードを回避するために、クライアントも確認する必要があります。
ティロ

2
はい。ただし、以下の私の回答を参照してください-クライアント側のチェックに依存しないでください-遅かれ早かれ回避されます。:)
ZombieSheep

4
クライアント側のチェックはサーバーを保護するものではなく、ユーザーにとって便利です。
Thilo、

承知しました。OPに依存しないようにアドバイスしています。
ZombieSheep 09

回答:


269

Path.GetExtension

string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"

8
これにより、誰かがファイル* .flvの名前を変更してアップロードできるようになります。要件によっては、MIMEタイプも確認する必要がある場合があります。
David Glenn、

通常、MIMEタイプはファイル名拡張子に従って設定されませんか?
ティロ

@Thilo、その通りですが、拡張子はMIMEコンテンツタイプを変更せずに変更できます。MIMEタイプはファイルに含まれるデータを説明するため、適切に処理できます。en.wikipedia.org/ wiki
Mark Dickinson、

2
いいえ、ファイルの内容を確認することをお勧めします。flv署名を確認する必要があります。
Marat Faskhiev、2009

まだ一般的な答えなので、これに追加するだけです。MIMEタイプの引数は、両方ともなりすましの可能性があるので、拡張子と同じくらい安全ではありません。両方のチェックの組み合わせはおそらく妥当な解決策ですが、最終的にセキュリティが懸念される場合は、たとえば署名されていないファイルのブロックやコンテンツのサンプリングなど、より厳密なチェックが必要です。
James

21

あなたは単にファイルのストリームを読むかもしれません

using (var target = new MemoryStream())
{
    postedFile.InputStream.CopyTo(target);
    var array = target.ToArray();
}

最初の5/6インデックスはファイルタイプを示します。FLVの場合には、その70、76、86、1、5

private static readonly byte[] FLV = { 70, 76, 86, 1, 5};

bool isAllowed = array.Take(5).SequenceEqual(FLV);

isAllowed等しい場合true、そのFLV。

または

ファイルの内容を読み取る

var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);

最初の2、3文字でファイルの種類がわかります。
FLVの場合、「FLV ......」

content.StartsWith("FLV")

3
これはより高く評価されるべきです。アプリケーションが本当に機能してデータが信頼できない場合は、最初に確認する必要があります。
PRMan 2017

7

サーバーでは、MIMEタイプを確認し、flv MIMEタイプをここまたはGoogleで検索できます。

MIMEタイプが

video/x-flv

たとえば、C#でFileUploadを使用している場合は、

FileUpload.PostedFile.ContentType == "video/x-flv"

5

これがあなたが望むものかどうかはわかりませんが:

Directory.GetFiles(@"c:\mydir", "*.flv");

または:

Path.GetExtension(@"c:\test.flv")

4

さらに、がある場合は、FileInfo fi簡単に行うことができます。

string ext = fi.Extension;

そして、それはファイルの拡張子を保持します(注:にはが含まれる.ため、上記の結果は次のようになります:.jpg .txtなど)


2

ユーザーがクライアント側でアップロードするファイルタイプを制限することはできません[*]。これはサーバー側でのみ実行できます。ユーザーが誤ったファイルをアップロードした場合は、ファイルがアップロードされてからアップロードされたことを認識できます。ユーザーが希望するファイル形式をアップロードしないようにする信頼できる安全な方法はありません。

[*]はい、アップロードを開始する前にあらゆる種類の賢い方法でファイル拡張子を検出できますが、それに依存しないでください。誰かがそれを回避し、遅かれ早かれ好きなものをアップロードします。


1
ハッカーが望んでいるものをアップロードするのを防ぐことはできませんが、ユーザーの便宜のためにクライアント側で確認する必要があります。Flashアップローダーはファイルタイプを確認できる必要があります。
Thilo、

1
OPはFlashアップローダー(つまり、「Flashコンテンツのアップローダー」ではなく「フラッシュで書かれたアップローダー」)について言及していません。質問はasp.netおよびc#タグでタグ付けされており、これらのテクノロジーを選択すると、クライアント側のチェックが制限され、簡単に無効になります。:)
ZombieSheep

ビデオアップロードサイトの場合は、HTMLアップロードフォームよりもクライアント側に優れたものが必要です。プログレスバーのないマルチMBアップロードは面白くありません。
ティロ

クライアント側のチェックはそれほど良くないことを言って大丈夫です。サーバー側でどのようにチェックインできますかZombieSheep氏
Surya sasidhar

@Thilo-もっと同意できませんでしたが、問題はASP.netのアップロードフォームについてです。それが十分であると彼が考えるかどうかは、OP次第です。
ZombieSheep 09


2

EndsWith()

パスを指定する必要がないので、私がDotNetPerlsでより良い代替ソリューションを見つけました。これは、カスタムメソッドを使用して配列にデータを入力した例です。

        // This custom method takes a path 
        // and adds all files and folder names to the 'files' array
        string[] files = Utilities.FileList("C:\", "");
        // Then for each array item...
        foreach (string f in files)
        {
            // Here is the important line I used to ommit .DLL files:
            if (!f.EndsWith(".dll", StringComparison.Ordinal))
                // then populated a listBox with the array contents
                myListBox.Items.Add(f);
        }

2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

上記の方法は、FirefoxとIEで正常に動作します。zip、txt、xls、xlsx、doc、docx、jpg、pngなどのすべてのタイプのファイルを表示できます

しかし、googlechromeからファイルの拡張子を見つけようとすると、失敗しました。


2

拡張を取得するのと並行して、拡張を削除する方法についても言及する価値があります。

var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only

var extension = Path.GetExtension(fileFullName); // Get the extension only

0

このソリューションは、「Avishay.student.DB」のような複数の拡張機能の場合にも役立ちます。

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.