【问题标题】:Ruby/Sinatra send_file not workingRuby/Sinatra send_file 不工作
【发布时间】:2012-01-29 09:33:27
【问题描述】:

我在 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)有问题。有什么问题?谢谢!

【问题讨论】:

  • 检查所有浏览器中的 URL 是否正确。请求是否真的到达了 sinatra 应用程序?
  • 是的,Sinatra 收到请求,并直接用 404 回复它

标签: ruby google-chrome safari sinatra sendfile


【解决方案1】:

如果我删除文件名中的初始斜杠,我可以让它在 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

【讨论】:

  • 没什么大不了的,只有受信任的公司成员才能访问
  • 好的,我添加了一个简单的检查,无论如何它都是一个不必要的攻击向量。
  • Sinatra 默认使用启用了路径遍历保护的机架保护,所以这个检查是不必要的。 (编辑:在写答案时这可能不是真的,但现在肯定是真的)
猜你喜欢
  • 2014-01-05
  • 2023-04-08
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多