6

私はsend_fileSinatraアプリで使用しています:

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、Firefoxのように404が返されます。ヘッダーが表示されると、404になります。しかし、Safariで試してみると、ファイルがダウンロードされます。だから私は私のコード(そしてSafariのコード)に何か問題があると思いますが、それはAppleに任せましょう:P。何が間違っている可能性がありますか?ありがとう!

4

1 に答える 1

3

filenameの最初のスラッシュを削除すると、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アプリにfoo.rbという名前を付けました。このリクエストにより、sinatraスクリプトがダウンロードされます。

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