我在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)。可能有什么不对?谢谢!
答案 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