清理Ruby / Rails中的文件名

时间:2012-06-23 02:43:03

标签: ruby mime-types

为了确定附件的文件类型,我使用了操作系统“文件”实用程序:

class AttachedFileTypeValidator < ActiveModel::Validator
  def validate(record)
    file = record.resource.uploaded_file
    attached_file = Rails.root + file.path
    file_type = `file #{attached_file}`
    Rails.logger.info "Attached file type determined to be: #{file_type}"
    unless file_type.split(',').first =~ /ASCII|UTF/
      record.errors[:resource_content_type] << "Attachment does not appear to be a text CSV file, please ensure it was saved correctly."
    end
  end
end

不幸的是brakeman表明了它的命令行注入机会。我假设这意味着有人为一个文件找出一个聪明的名字,如:

; rm -rf /;

我们离开了。什么是清理文件名的好方法?

1 个答案:

答案 0 :(得分:3)

使用IO#popen调用外部命令:

file_type = IO.popen(['file', attached_file]).read

这将为您正确处理文件名中有趣字符的转义。