2016-04-10 10 views
3

私はS3バケットにmp3ファイルをアップロードしようとしています。私はどこかで、最良の方法は、サーバーを経由しないで、HTMLフォームからS3に直接ファイルをアップロードすることです。しかし、私は疑問に思っていた:このアプローチは安全ですか?アクセスキーの適用など、セキュリティ上の理由からサーバが必要ではありませんか?フォームから直接S3にアップロード

また、私はそれを動作させるのがむしろ難しいと思っています。正式な説明はあまり詳しくはないと思います。

私はこのガイドに従っています:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html公式ガイドです。私はそれが正しいことを確信していません。これは正しい方法であれば、あなたは私に教えてもらえますし、私が間違ってやっている:

1.私は、「X-AMZ-メタ何であるかをポリシーオブジェクト

{ "expiration": "2015-12-30T12:00:00.000Z", 
    "conditions": [ 
    {"bucket": "sigv4examplebucket"}, 
    ["starts-with", "$key", "user/user1/"], 
    {"acl": "public-read"}, 
    {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"}, 
    ["starts-with", "$Content-Type", "image/"], 
    {"x-amz-meta-uuid": "14365123651274"}, 
    {"x-amz-server-side-encryption": "AES256"}, 
    ["starts-with", "$x-amz-meta-tag", ""], 

    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"}, 
    {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, 
    {"x-amz-date": "20151229T000000Z" } 
    ] 
} 
  • に必要事項を記入します - uuid "と私はどこでそれを見つけるのですか?
  • "x-amz-credential"ノードには何を書きますか?

2.私は、アップロードフォームでHTMLページを作る

3.ポリシーオブジェクトをエンコードBASE64

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

    </head> 
    <body> 

    <form action="http://sigv4examplebucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
    Key to upload: 
    <input type="input" name="key" value="user/user1/${filename}" /><br /> 
    <input type="hidden" name="acl" value="public-read" /> 
    <input type="hidden" name="success_action_redirect" value="http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html" /> 
    Content-Type: 
    <input type="input" name="Content-Type" value="image/jpeg" /><br /> 
    <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /> 
    <input type="hidden" name="x-amz-server-side-encryption" value="AES256" /> 
    <input type="text" name="X-Amz-Credential" value="AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request" /> 
    <input type="text" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
    <input type="text" name="X-Amz-Date" value="20151229T000000Z" /> 

    Tags for File: 
    <input type="input" name="x-amz-meta-tag" value="" /><br /> 
    <input type="hidden" name="Policy" value='<Base64-encoded policy string>' /> 
    <input type="hidden" name="X-Amz-Signature" value="<signature-value>" /> 
    File: 
    <input type="file" name="file" /> <br /> 
    <!-- The elements after this will be ignored --> 
    <input type="submit" name="submit" value="Upload to Amazon S3" /> 
    </form> 
    </body> 
</html> 
  • フォームの入力値があるようですフォームでも参照している新しく作成されたPolicyオブジェクトと同じです。では、どうして私はこれらを2回記入しなければなりませんか?

答えて

0

お探しのものは、AWS S3の事前に署名されたURLです。基本的には、手順は次のとおりです。

1)サーバは、それがキーAWS)を持っているので

2)サーバーがブラウザにこの事前署名URLを渡す(事前に署名したURLを生成

ファイルをアップロードすることができます3)ブラウザ直接この事前署名urlでS3に

参考:http://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html

+0

これは本当に私の質問への答えではありません! – olefrank

+0

申し訳ありませんが、私はそれをはっきりと述べていませんでした。私はあなたの質問に答えようとしていました。「このアプローチは安全ですか?アクセスキーを適用するなどのセキュリティ上の理由からサーバーが必要ではありませんか?」重要なことは、AWSアクセスキーをブラウザに直接渡すのではなく、事前に署名されたURLを渡すことができ、ブラウザがそれを使用してS3にアップロードできることです。これはあなたが投稿したものと比較してもう一つのより安全なアプローチです。この参考資料は良い例です(https://www.terlici.com/2015/05/23/uploading-files-s3.html)。注意: "s3.getSignedUrl" – Tommy