2017-01-13 6 views
0

NodeJS/Formidableを使用しており、画像のアップロードのためにバックエンドを保護しようとしています。NodeJS/Formidable:画像アップロードのバックエンドを保護する

ファイルが画像であるかどうかを確認するための古典的な方法は、次のように正規表現を使用することです:

if(!file.name || file.name.match(/\.(jpg|jpeg|png)$/i)) { 
    console.log("the file is an image"); 
}else{ 
    console.log("the file is not an image"); 
} 

と、この:

var fileType = file.type.split('/').pop(); 
if(fileType == 'jpg' || fileType == 'png' || fileType == 'jpeg'){ 
    console.log("the file is an image"); 
} else { 
    console.log('incorrect file type: ' + fileType); 
} 

これは良いチェックが、これはに十分ではありません安全であること。例えば、JPGのようにPDFの名前を変更すると、ブラウザはファイルの拡張子に基づいてMIME/type:image/jpgを提供します。 これはセキュリティ上の問題です.JSファイルなどの名前をJPGに変更し、バックエンドファイルシステムにアップロードすることができるからです。

が、私はこれは本当に興味深い記事を見つけました: How to check file MIME type with javascript before upload?

これは、クライアント側のチェックに最適ですが、私は私のバックエンドでこれを再現することができませんよ。

私は理想的な方法は、オンザフライでストリームを分析し、最初の4バイトのアップロード後に実際のMIMEタイプをチェックすることだと思います。

Thx!

答えて

1

あなたは、おそらくバッファ(少なくとも最初の4100バイト)を取り、あなたのMIMEタイプとファイル拡張子を返しますfile-type NPMパッケージのようなものを使用する必要があります

const fileType = require('file-type') 
fileType(buffer) //=> {ext: 'png', mime: 'image/png'} 
+0

おかげで、それは本当にいいですね! –

0

それは働きます! あなたがバッファにファイルを変換し、そのような何かを書くことreadChunkのようなモジュールをインストールすることができます。

form.on('file', function(field, file) { 
    buffer = readChunk.sync(file.path, 0, 4100); 

    filetype = fileType(buffer); 

    if(filetype.ext.match(/(jpg|jpeg|png)$/i)) { 
     fs.rename(file.path, path.join(form.uploadDir, file.name)); 
    }else { 
     fs.unlink(file.path); 
    } 

}); 
関連する問題