refileを使用して、ユーザーが S3 バックエンドに画像をアップロードできるようにします。remote_image_url
さらに、インターネット上の任意の画像への URL を (プロパティを通じて) 入力するオプションをユーザーに提供します。
入力した URL が実際のファイルを指している限り、これは正常に機能します。ただし、URL に誤りがあった場合、または無意味な入力が与えられた場合Refile
は、次の例外がスローされます。
Errno::ENOENT (No such file or directory @ rb_sysopen - thiswillnotwork):
app/controllers/my/deals_controller.rb:17:in `create'
appsignal (0.11.2) lib/appsignal/rack/listener.rb:13:in `call'
入力された URL が無効な場合 ( validate_download
CarrierWave のオプションと同様) を無視し、理想的には代替画像を使用するオプションはありますか?
raise_errors
オプションを に設定してアタッカーを取り付けてみましたfalse
が、結果は同じでした。
私たちのプロジェクトでは と を使用Rails 4.2.0
しRefile 0.5.3
ます。
編集:
SystemCallError
この例外はに由来する下位レベルでKernel.open
あり、この例外タイプは Refile によってレスキューされていないことを確認しました。
rescue OpenURI::HTTPError, RuntimeError => error
raise if error.is_a?(RuntimeError) and error.message !~ /redirection loop/
@errors = [:download_failed]
raise if @raise_errors
end
これを修正するために再ファイルするプルリクエストに取り組んでいます。
編集2:
これに取り組んでいる間に、潜在的な攻撃者がリモート コード実行を使用できるようにする重大なセキュリティ上の問題がに発見されました。Refile
Refile gem には、URL を指定してリモート ファイルをアップロードする機能があります。
remote_image_url
これは、フォームのようにフィールドを追加することで実行できます。ここimage
で、 は添付ファイルの名前です。この機能は、open-uri を使用して、渡された URI を検証せずにこの HTTP 要求を作成していました。攻撃者は、ホスト マシンで任意のシェル コマンドを実行する URI を作成できます。
Refile
バージョン0.5.0
-を使用している場合は0.5.3
、最新バージョンにアップグレードしてください。アップグレードすると、上記の問題も解決されます。