JavaScript проверяет, является ли загружаемый файл его расширением - PullRequest
0 голосов
/ 30 ноября 2018

Я столкнулся с ситуацией, когда я пытаюсь проверить, разрешено ли загружать файлы только определенных типов.

Метод, над которым я работал, заключается в проверке заголовка кода 64b, чтобы определить, соответствует ли он принятым файлам.

  dataHeader = (b64FileString.split(';'))[0]
  imgRegex = /data:image\/((jpeg)|(jpg)|(gif)|(exif)|(tiff)|(bmp)|(png)|(bpg))?$/gmi;

Если я пытаюсь загрузить файл изображения image.png заголовок выглядит следующим образом "data:image/png" и регулярное выражение работает.

Этот метод работает, но только в определенной степени.

Начиная этот процесс, я предполагаю, что заголовок основан на фактическом формате файла, но это не так.Заголовок на самом деле просто основан на расширении файла.

Если у меня есть следующее в windows program.exe,

, заголовок выглядит следующим образом "data:application/x-msdownload"

Регулярное выражение не совпадает, и файл не принят.

Если пользователь изменяет расширение program.exe на program.png,

Теперь заголовок "data:image/png" и регулярное выражение принимает.

Что можно сделать, чтобы проверить, что файл изображения на самом деле является файлом изображения, а не помечен как-то еще?

1 Ответ

0 голосов
/ 30 ноября 2018

Я полагаю, что для достижения желаемого вам придется проанализировать сами данные файла и сравнить байтовые подписи ( магические числа ) с типами, которые вы хотите разрешить.Если ваш сервер передает потоки байтов, вы сможете проверить и отменить досрочно, если найдена неверная подпись.Например, все png файлы начинаются с:

137 80 78 71 13 10 26 10 
  or in hex
89 50 4E 47 0D 0A 1A 0A

Если вы используете, например, node в качестве бэкэнда, вы можете использовать библиотеку, например file-type достичь этого довольно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...