Ruby/Sinatra send_file无效

pme*_*ino 6 ruby safari google-chrome sinatra sendfile

我正在使用send_fileSinatra应用程序:

get '/update/dl/:upd' do

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

/uploads/它不是公开的文件夹,它在app dir上.当我尝试使用localhost:4567/update/dl/some_fileChrome时,它返回404,就像使用Firefox一样,当看到标题时,它是404.但是如果我尝试使用Safari,它会下载文件.所以我觉得我的代码(和Safari的代码有问题,但让我们把它留给Apple:P).可能有什么不对?谢谢!

sun*_*ity 3

如果我删除文件名中的初始斜杠,那么它就可以在 Chrome 中正常工作,这样它就是“文件名而不是”/文件名。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
Run Code Online (Sandbox Code Playgroud)

然而,这确实存在一个很大的安全漏洞,用户可以下载 sinatra 进程有权访问的任何内容,我将我的 sinatra 应用程序命名为 foo.rb,并且此请求下载 sinatra 脚本:

 http://localhost:4567/update/dl/..%2Ffoo.rb
Run Code Online (Sandbox Code Playgroud)