有没有办法确定用户上传的文件是否受密码保护?我们有一个场景,我们不希望我们的用户在我们的基于Ruby on Rails构建的应用程序中上传受密码保护的文件。
文件类型可以是PDF
,也可以是Word文档(DOC
或DOCX
)
答案 0 :(得分:1)
我不知道任何可用于此类任务的Ruby库。
但您可以从Ruby代码中调用docx2txt
和pdftotext
等外部工具。对于调用这些工具的加密文件,会导致向STDERR打印消息并返回非零退出代码。
让我们来看看这个演示代码:
#!/usr/bin/env ruby
require 'open3'
file_names = ARGV
command = ""
file_names.each do |file_name|
case file_name
when /.\.pdf$/i
command = "pdftotext #{file_name} -"
when /.\.docx$/i
command = "docx2txt #{file_name} -"
else
next
end
stdout, stderr, status = Open3.capture3(command)
puts "command: #{command}"
puts "stdout: #{stdout}"
puts "stderr: #{stderr}"
puts "status: #{status}"
puts
end
我为pdf和docx创建了四个文件,其中包含自解释名称:pass.docx
,pass.pdf
,no_pass.docx
,no_pass.pdf
并在脚本上方执行:
./tester.rb pass.pdf pass.docx no_pass.pdf no_pass.docx
command: pdftotext pass.pdf -
stdout:
stderr: Command Line Error: Incorrect password
status: pid 5856 exit 1
command: docx2txt pass.docx -
stdout:
stderr: Failed to extract required information from <pass.docx>!
status: pid 5860 exit 2
command: pdftotext no_pass.pdf -
stdout: Hello world.
stderr:
status: pid 5866 exit 0
command: docx2txt no_pass.docx -
stdout: Hello world.
stderr:
status: pid 5870 exit 0
至少对于PDF,如果在未提供有效密码(使用pdftotext
参数指定)的情况下调用-upw
,则可以确定文件是否受密码保护。只需注意Command Line Error: Incorrect password
stderr消息。
不幸的是,我无法找到docx
的工具,在这种情况下会返回明确的错误消息 - 可能还有其他原因导致docx2txt
无法使用{{1}转换文件消息,这将需要进一步调查。