Ruby / Sinatra send_file не работает - PullRequest
       23

Ruby / Sinatra send_file не работает

6 голосов
/ 28 декабря 2011

Я использую 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). Что может быть не так? Спасибо!

1 Ответ

3 голосов
/ 29 декабря 2011

Я получаю его нормально работать в 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
...