6

send_file在 Sinatra 应用程序上使用:

get '/update/dl/:upd' do

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

它不是公开的文件夹/uploads/,它在应用程序目录上。当我尝试localhost:4567/update/dl/some_file在 Chrome 中访问时,它会返回一个 404,就像使用 Firefox 一样,当看到标题时,它是一个 404。但是如果我尝试使用 Safari,它会下载该文件。所以我猜我的代码(和 Safari 的,但让我们把它留给 Apple :P)有问题。有什么问题?谢谢!

4

1 回答 1

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

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

 http://localhost:4567/update/dl/..%2Ffoo.rb
于 2011-12-28T20:04:21.503 回答