2017-01-13 4 views
0

Я использую NodeJS/Formableable, и я пытаюсь защитить свой сервер для загрузки изображений.NodeJS/Исключительно: защитите бэкэнд для загрузки изображений

Классический способ проверить, является ли файл изображения, чтобы использовать регулярное выражение как это:

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); 
} 

Это хорошая проверка, но это не достаточно быть в безопасности; на самом деле, если я переименую PDF как JPG, например, браузер предоставит MIME/type: image/jpg на основе расширения файла. Это проблема безопасности, потому что вы можете переименовать JS-файл или что-нибудь в JPG и загрузить его в свою файловую систему.

Я нашел это очень интересный пост: How to check file MIME type with javascript before upload?

Это идеально подходит для проверки на стороне клиента, но я не в состоянии воспроизвести это в моем внутреннем интерфейсе.

Я думаю, что идеальным способом является анализ потока «на лету» и проверка реального типа MIME после загрузки первых 4 байтов.

Любая идея?

Thx!

ответ

1

Вы должны, вероятно, использовать что-то вроде пакета file-type НПХ, которая принимает буфер (по крайней мере первые 4100 байт) и вернет вам тип MIME и расширение файла:

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); 
    } 

}); 
Смежные вопросы