Как я могу обеспечить загрузку этого файла, используя Express.js и Formidable? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь изучить рекомендации по безопасности для NodeJS / Express. Как я могу обеспечить загрузку этого файла? В настоящее время он просто помещает файлы в папку. Я обеспокоен тем, что пользователи загружают вредоносные файлы / код.

Это простая загрузка файла из формы моего интерфейса пользователя. Цель состоит в том, чтобы позволить людям загружать аватары для своего профиля. Я использую Formidable, поэтому могу проверить тип изображений, но мне интересно, достаточно ли это безопасно?

server.js

const express = require('express');
const server = express();

server.listen(8000, () => {
  console.log('Server started!');
});

server.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept',
  );
});

const upload = require('./upload');
server.post('/upload', upload);

upload.js

const IncomingForm = require('formidable').IncomingForm;

module.exports = function upload(req, res) {

  var form = new IncomingForm();

  form.parse(req);

  form.on('file', (field, file) => {
    console.log(file);
  });

  form.on('fileBegin', function(name, file) {
    file.path = __dirname + '/uploads/' + file.name;
  });

  form.on('end', () => {
    res.json();
  });
};

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Следующие 2 шага являются основными.

В веб-интерфейсе допускаются только определенные расширения файлов, такие как (.pdf, .png и т. Д.) С такими ограничениями, как размер. (Не забывайте, что интерфейсным кодом можно манипулировать). 2. Вам также необходимо проверить расширения и размеры файлов в бэкэнде (если вы используете нод, вы можете использовать multer для достижения этой цели).

Что еще мы можем сделать в бэкэнде?

Если мы полагаемся только на проверку расширений, это не поможет. (любой может изменить имя sample.exe на sample.jpg и загрузить). Например, если вы проверяете, загружен ли файл загруженного изображения или нет в бэкэнде, кроме проверки с расширением файла, вы также можете следовать нижеприведенному подходу.

Первые восемь байтов файла PNG всегда содержат следующие (десятичные) значения: 137 80 78 71 13 10 26 10

Если вы хотите проверить, является ли загруженный файл png или нет, условие будет работать. Мало того, что если вы хотите проверить загруженные файлы должным образом или нет, вы можете следовать некоторым подходам, как указано выше. (для .pdf, .doc могут быть некоторые правила). Вы можете проверить данные подписи MIME, что является лучшей практикой.

Не сохранять загруженные файлы в хранилище кода бэкенда. Храните их в другом рабочем пространстве. (необязательный) Следующие ссылки могут помочь.

Облачные хранилища

Помимо хранения файлов на локальном сервере, вы можете сохранять загруженные файлы в облаке, например, в amazon s3 bucket. После каждой загрузки любого файла в эту корзину s3 вы можете запускать сканер с помощью lambdas (автоматических сканеров файлов на amazon).

Кроме amazon вы также можете использовать Google Drive для загрузки файлов (не оптимальный вариант). Но когда кто-то загружает загруженный файл, Google автоматически проверяет на наличие вирусов.

ссылки на сканирование файла амазонки s3 bucket ::

сканирование файлов корзины amazon s3 SO

амазонка s3 bucket files reddit

s3 сканирование файлов с использованием lambda & clamav

Для локального сервера ::

Официальная проверка подписи MIME

плагин проверки типов файлов

сканирование моллюсков npm

проверка содержимого изображения без расширения SO 1

проверка содержимого изображения без расширений SO 2

1 голос
/ 02 июля 2019

Вы также можете проверить MIME Content-type с запросом:

if (contype.indexOf('image/png') !== 0)

Кроме того, проверка расширений файлов:

file.extname('cool_picture.png')

И, наконец, что не менее важно, проверить файлЗаголовки в шестнадцатеричном формате.Все типы файлов начинаются с последовательности шестнадцатеричных цифр.Что это значит?

PNG всегда начинается с последовательности: 5089 474e 0a0d 0a1a

JPG всегда начинается с последовательности: d8ff e0ff 1000 464a

И так далее, так что вы можетесоздайте базовые строки или массивы с начальными заголовками файлов для изображений, например PNG_HEADER = '5089 474e 0a0d 0a1a';, прочитайте заголовки файлов при загрузке и сравните, если совпадает с типом содержимого и расширением файла.

Это должно быть хорошо для вашей загрузки.

...