Ответ 1
Проверки проверки спуфинга с помощью Paperclip не выполняются, потому что команда file
не может точно определить тип файла.
В вашем журнале content type discovered from file command: .
- пробел перед периодом является результатом вывода - т.е. пустым. Однако на другой стороне сравнения используется чисто расширение файла, которое правильно воспринимается как файл excel. Следовательно, ваш отказ от проверки.
Текущая версия Paperclip использует file -b --mime-type
для определения файла, однако --mime-type
не поддерживается всеми реализациями. Существует замена на использование --mime
, но пока это еще не достигнуто.
Я думаю, у вас есть некоторые варианты. Выбор, который вы выбираете, зависит от того, как вы относитесь к некоторому изворотливому файлу, который загружается и называется файлом excel. Если вы беспокоитесь об этом, попробуйте вариант 1; если вы не беспокоитесь по поводу варианта 2 или 3.
1) Замените проверку спуфинга на использование --mime
вместо --mime-type
.
Переопределите type_from_file_command
в инициализаторе:
module Paperclip
class MediaTypeSpoofDetector
private
def type_from_file_command
# -- original code removed --
# begin
# Paperclip.run("file", "-b --mime-type :file", :file => @file.path)
# rescue Cocaine::CommandLineError
# ""
# end
# -- new code follows --
begin
Paperclip.run("file", "-b --mime :file", :file => @file.path)
rescue Cocaine::CommandLineError
""
end
end
end
end
2) Обходите проверку file
, полностью установив тип файла из его расширения файла.
Установите эту опцию "Скрепка" где-нибудь, которая читается во время инициализации приложения (например, config/application.rb
, config/environments/<environment>.rb
или config/initializers/paperclip.rb
):
Paperclip.options[:content_type_mappings] = { xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }
3) Отключить спуфинг вообще.
Переопределите проверку подмены, создав что-то вроде этого в инициализаторе:
module Paperclip
class MediaTypeSpoofDetector
def spoofed?
false
end
end
end
Update:
Валидация, которую вы имеете в своей модели, не является причиной этой проблемы. Это проверяет, какие типы файлов вы можете загрузить; то, что вы видите, это Paperclip, вычисляющий, что тип файла действителен, но его содержимое не соответствует типу файла.
Предполагая, что вы можете заставить проверку подстановки работать, есть одна аномалия с проверкой содержимого. Выведенное сообщение об ошибке говорит, что "разрешены только файлы XML, EXCEL", однако ваша фактическая проверка проверяет MS word и excel файлы, а не xml.
Если ваше сообщение верное и вы хотите разрешить только файлы xml и excel, вы должны изменить проверку содержимого content_type следующим образом:
validates_attachment_content_type :upload_file, :content_type => %w(application/xml application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),
:message => ', Only XML,EXCEL files are allowed. '