2016-07-08 20 views
1

ファイルの種類を制限:(注:私は、AWS-SDK V1を使用しています)S3直接アップロード私はこのようなpresignedポストを生成

@s3_direct_post = S3_BUCKET.presigned_post(
          key: "uploads/#{SecureRandom.uuid}/${filename}", 
          success_action_status: '201', 
          acl: 'public-read', 
          content_type: 'image/png' 
          ) 

私はしかしこのdoesnの、唯一のPNGファイルへのユーザーのアップロードを制限したいと思いますそれはすべての種類のファイルを許可します。

+1

@Lahiru私はそれを修正しますが、それは問題の原因ではありません! – medBo

答えて

1

あなたの例で使用されているcontent_typeは、アップロードされたオブジェクトのコンテンツタイプが実際にであることをS3に伝えるために使用される引数です。つまり、許可されているものを制限するものではありません。アプリケーションに応じて

、そしてどのように重要なこの制限は、あなたがアップロードした後、クライアント上、またはサーバ上のいずれかのアップロードの本物のコンテンツタイプを検証する必要がありますどちらか。

単純な解決策はありません。 S3は、署名された投稿のアップロードを生成し、あなたがアップロードされているオブジェクトのコンテンツタイプを知っていてそれを適切に設定することを信じているので、送信した値を受け入れます。

+0

ああ私は見る!私はブラウザから直接アップロードを行っているので、訪問者が署名付き投稿を作成して戻すためにファイルタイプを含むファイル - > ajaxリクエストを追加するときです(ファイル拡張子ajax経由でファイルが本当にpngかjpgかどうか分かりません) – medBo

+0

他の方法はサーバーにアップロードしてからs3に保存しますが、それは多くのパフォーマンスに影響しますか?アップロードが処理中の他のリクエストをブロックしないようにする – medBo

1

私はこれをテストしなかったので、これがあなたを助けるかもしれないかどうかはわかりません。

しかし、このdocumentationあたりとして、私はあなたがこのようなものを使用することによって、これを克服することができるだろうと思います。

bucket.presigned_post.where(:content_type).starts_with("image/png") 

s3 direct upload restricting file size and typeにこの回答を参照してください。

万が一、あなたがこれを逃し、それはいくつかの助けになるかもしれません願っていた場合、私はこれを指摘したかったので、ご注意ください。

+1

それは 'Content-Type' *ヘッダ*を他のものに設定することを妨げるでしょう。実際に偽造されたヘッダーを持つ実際の種類のコンテンツを悪意のあるユーザーがアップロードすることは実際には防止されません。しかし、良い点。 –

+0

Understood @ Michael-sqlbot :)私の場合、私は 'carrierwave' gemを使って制限しました。このダイレクトアップロードの方法については不明でした。 – Lahiru

関連する問題