0

在 _form 中,我有一个上传文件的字段。我要做的是检查文件是否包含危险的扩展名。

就我而言,如果扩展名是以下之一,我会返回一条错误消息:. '蝙蝠'。'和'。'可执行程序'。'src',。'命令'

所以我这样做了:

def suspitious_attachment        
  if ends_with? '.bat', '.com', '.exe', '.src', '.cmd'
    errors.add(:base, I18n.t('errors.messages.suspitious_attachment', :value => attachments.split(".").last))
  end
end

但这不是一个好主意,一个文件的名称中可以有多个点。

所以我想得到名字的最后4个字母。

我无法做到这一点,你能帮帮我吗?

对不起我的英语不好。

4

2 回答 2

3

您可以使用[-4..-1][-4, 4]

'this.is.really.dangerous.file.exe'[-4..-1]
# => ".exe"
'this.is.really.dangerous.file.exe'[-4, 4]
# => ".exe"
'a_file.rb'[-4..-1]
# => "e.rb"

File::extname更适合获取文件名。

File.extname 'a_file.cmd'
# => ".cmd"
File.extname 'a_file.rb'
# => ".rb"
File.extname 'this.is.really.dangerous.file.exe'
# => ".exe"
于 2013-10-31T03:35:50.147 回答
2

你在这里让自己陷入一种虚假的安全感。检查文件名不会阻止有人上传带有假扩展名的文件。

如果您需要验证文件格式,则应改为检查 MIME 类型。

在此处查看更多信息:如何检查 rails 上传的文件类型?

于 2013-10-31T03:56:20.100 回答