3

アプリケーションのファイル ストレージ サーバーとして Rackspace Cloud Files を使用しています。ユーザーがアップロードするファイルは、アプリケーション内から承認される必要があり、コントローラーから正しい Rackspace Cloud Files CDN URL にリダイレクトされます。Rackspace Cloud Files の Referrer ACL を使用して認証を行おうとしています。

ですから、私が達成しようとしていることを明確にするために、非常に単純なスニペットを追加さ​​せてください。

class FilesController < ApplicationController
  def download
    redirect_to(some_url_to_a_file_on_cloud_files_url)
  end
end

このダウンロード アクションにアクセスするためにユーザーがアクセスする URL は次のようになります。

http://a-subdomain.domain.com/projects/:project_id/files/:file_id/download

そのため、CloudFiles gem を使用して、動作するはずの ACL リファラーの正規表現をセットアップしました。

http\:\/\/.+\.domain\.com\/projects\/\d+\/files\/\d+\/download

ユーザーが Web UI のリンクをクリックすると、リンクが上記の URL にルーティングされ、パラメーターに応じて、ダウンロード アクションからユーザーが正しい Rackspace Cloud Files ファイル URL にリダイレクトされます。

さて、私が得たのは、私が無許可であるというエラーです (間違った http リファラー)。ダウンロードアクションから直接クラウドファイルにリダイレクトしているため、HTTPリファラーとして「カウント」されず、このURLをリファラーとして使用するのではなく、これを使用している可能性があると思いますURL:

http\:\/\/.+\.domain\.com\/projects\/\d+\/files

これは、「ダウンロード」リンクをクリックするときに表示されるページであるため、ユーザーは FilesController のダウンロード アクションに誘導されます。

Rackspace ACL の HTTP リファラーを次のように設定すると、次のようになります。

http\:\/\/.+\.domain\.com\/projects\/\d+\/files

そして、リンクをクリックしてください。ダウンロードする権限があります。しかし、これは十分に安全ではありません。なぜなら、誰でも、たとえば、html にバグを発見し、ファイルへの生のリンクを挿入してアクセスできるからです。

だから私の質問は、私が達成しようとしていることがうまくいかない方法や理由を知っている人はいますか?何か提案/アイデアはありますか? 私が言ったように、ユーザーがリンクをクリックすると、ユーザーがクラウドファイル上の実際のファイルにリダイレクトされているURLではなく、ファイルがクリックされている場所にリファラーが設定されている可能性があると思います.

このようなことは可能ですか?

class FilesController < ApplicationController
  def download
    # Dynamically set a HTTP Referrer here before
    # redirecting the user to the actual file on cloud files
    # so the user is authorized to download the file?
    redirect_to(some_url_to_a_file_on_cloud_files_url)
  end
end

どんな助け、提案も大歓迎です!

ありがとう!

4

2 に答える 2

0

一般に、Micahelのコメントは、S3がこの問題でRackspaceを上回っている理由を説明するのに十分ですが、Rackspaceリクエストに特別なHTTPヘッダーを追加したい場合は、独自のHTTPリクエストを実行し、ファイルを手動でフェッチしてください。

class DownloadsController < ApplicationController
   def download
     send_data HTTParty.get(some_url_to_a_file_on_cloud_files_url, :headers => {"x-special-headers" => "AWESOME" }), :file_name => "myfile.something"
   end
end

はい、この例をより適切にコーディングできますが、それは一般的な考え方です。

于 2012-08-13T16:26:38.667 に答える
0

「Referer」チェックはまだありませんが、現在のバージョンの Rackspace CloudFiles を使用して一時 URL (署名付き URL) を作成できます。

次のコードは、Rackspace のドキュメント サイトから取得したものです。

require "openssl"
 unless ARGV.length == 4
 puts "Syntax: <method> <url> <seconds> <key>"
 puts ("Example: GET https://storage101.dfw1.clouddrive.com/v1/" +
 "MossoCloudFS_12345678-9abc-def0-1234-56789abcdef0/" +
 "container/path/to/object.file 60 my_shared_secret_key")
 else
 method, url, seconds, key = ARGV
 method = method.upcase
 base_url, object_path = url.split(/\/v1\//)
 object_path = '/v1/' + object_path
 seconds = seconds.to_i
 expires = (Time.now + seconds).to_i
 hmac_body = "#{method}\n#{expires}\n#{object_path}"
 sig = OpenSSL::HMAC.hexdigest("sha1", key, hmac_body)
 puts ("#{base_url}#{object_path}?" +
 "temp_url_sig=#{sig}&temp_url_expires=#{expires}")
 end
于 2013-05-29T04:49:08.687 に答える