0

如果用户尝试在 Ruby on Rails 应用程序中上传加密文件,我想给出验证错误消息。我正在使用神社宝石进行附件。我怎么能做到 - 有什么想法吗?

我正在使用:Rails 5.1.6,ruby 2.4.2p198,神社 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

结尾

当我创建文档时。它不检查并接受加密文件

4

1 回答 1

0

Shrine 插件检测到的允许 MIME 类型的白名单determine_mime_type应自动拒绝加密文件。加密文件会更改其内容,包括file命令等实用程序用来确定文件的 MIME 类型的“魔术字节”。

因此,如果上传了加密文件,该file命令(在determine_mime_typeShrine 插件中默认使用)应该返回通用application/octet-streamMIME 类型,并且不通过白名单。

要实现这一点,首先在初始化程序中加载插件:

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
于 2018-07-15T16:53:21.410 回答