Как проверить вложение зашифровано или нет в приложении Rails

Я хочу дать сообщение об ошибке проверки, если пользователь попытается загрузить зашифрованный файл в приложение Ruby on Rails. Я использую драгоценный камень святилища для прикрепления. Как я могу это сделать - любая идея?

Я использую: Rails 5.1.6, ruby ​​2.4.2p198, shrine 2.9.0.


Это мой инициализатор

require 'shrine'

Shrine.plugin :activerecord
Shrine.plugin :cached_attachment_data # for forms
Shrine.plugin :determine_mime_type
Shrine.plugin :backgrounding
Shrine.plugin :delete_promoted

Shrine::Attacher.promote { |data| PromoteJob.perform_async(data) }
Shrine::Attacher.delete { |data| DeleteJob.perform_async(data) }

Этот загрузчик

class DocumentUploader < Shrine
  plugin :validation_helpers
  plugin :pretty_location

  plugin :processing
  plugin :versions

 process(:store) do |io, context|
    original = io.download
    out_file = Tempfile.new(["pdfsigned~", '.pdf'])
    SignPdf.sign_pdf!(original, io.original_filename, out_file, 
    context[:record], context[:record].creator_company, :uploaded, {} , false)
   { original: io, stamped: out_file }
 end

 Attacher.validate do
   validate_mime_type_inclusion ['application/pdf']
end

конец

когда я создаю документ. он не проверяет и принимает зашифрованный файл


person kashif    schedule 15.07.2018    source источник
comment
Файл — это поток байтов. Зашифрованный файл представляет собой поток байтов. Вам нужно придумать критерии для разделения двух потоков байтов, потому что с технической точки зрения нет никакой разницы. Как вы, как человек, определяете, является ли файл действительным, зашифрованным, поврежденным или просто случайным мусором?   -  person Sergio Tulentsev    schedule 15.07.2018


Ответы (1)


Внесение в белый список разрешенных типов MIME, обнаруженных плагином determine_mime_type Shrine, должно автоматически отклонять зашифрованные файлы. Шифрование файла изменяет его содержимое, в том числе «магические байты», которые такие утилиты, как команда file, используют для определения MIME-типа файла.

Таким образом, если загружается зашифрованный файл, команда file (используемая по умолчанию в плагине determine_mime_type Shrine) должна вернуть общий тип application/octet-stream MIME и не попасть в белый список.

Чтобы реализовать это, сначала загрузите плагины в свой инициализатор:

Shrine.plugin :determine_mime_type
Shrine.plugin :validation_helpers

Затем добавьте validate_mime_type_inclusion проверок в загрузчик, например:

# image_uploader.rb
class ImageUploader < Shrine
  Attacher.validate do
    validate_mime_type_inclusion %W[image/jpeg image/png image/webp]
  end
end

# video_uploader.rb
class VideoUploader < Shrine
  Attacher.validate do
    validate_mime_type_inclusion %W[video/mpeg video/mp4]
  end
end
person janko-m    schedule 15.07.2018
comment
Я уже включил необходимые плагины, но, похоже, они у меня не работают. - person kashif; 16.07.2018
comment
У меня это работает, вот пример, показывающий желаемое поведение: github.com/ shrinerb/shrine/issues/283#issuecomment-405290250 (просто публикую для справки) - person janko-m; 16.07.2018