Ruby / Sinatra send_file无效

时间:2011-12-28 18:37:19

标签: ruby google-chrome safari sinatra sendfile

我在Sinatra应用上使用send_file

get '/update/dl/:upd' do

    filename ="/uploads/#{params[:upd]}"
    send_file(filename, :filename => "t.cer", :type => "application/octet-stream")
end

文件夹/uploads/它不公开,它位于应用目录上。当我尝试转到Chrome中的localhost:4567/update/dl/some_file时,它返回404,就像使用Firefox一样,当看到标题时,它就是404.但是如果我尝试使用Safari,它会下载该文件。所以我觉得我的代码有些错误(和Safari一样,但让我们留给Apple:P)。可能有什么不对?谢谢!

1 个答案:

答案 0 :(得分:3)

如果我删除文件名中的初始斜杠,那么我可以在chrome中正常工作,因此它是“filename而不是”/ filename。 404来自send_file

中的文件未找到错误
# foo.rb
require 'sinatra'
get '/update/dl/:upd' do
    filename ="uploads/#{params[:upd]}"
    # just send the file if it's an accepted file
    if filename =~ /^[a-zA-Z0-9]*.cer$/
      send_file(filename, :filename => "t.cer", :type => "application/octet-stream")
    end
end

然而,这里确实有一个很大的安全漏洞,用户可以下载sinatra进程也可以访问的任何东西,我将我的sinatra app命名为foo.rb,这个请求下载了sinatra脚本:

 http://localhost:4567/update/dl/..%2Ffoo.rb