在_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个字母。
我无法做到这一点,你能帮助我吗?
抱歉我的英文。
答案 0 :(得分: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"
答案 1 :(得分:2)
你在这里愚弄自己的虚假安全感。检查文件名称不会阻止某人上传带有虚假扩展名的文件。
如果您需要验证文件格式,则应该检查MIME类型。