直接从表单上传到S3

4
我正在尝试将mp3文件上传到我的S3存储桶。我在某个地方读到,最好的方法是直接从html表单将文件上传到S3,而不通过服务器传输。但我想知道:这种方法是否安全?难道不需要服务器出于安全原因,如应用访问密钥等吗?
此外,我发现这很难实现。官方说明并不是很详细。
我遵循这个指南:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 这是官方指南。我不确定我是否做得对。你能告诉我这是正确的方法以及我做错了什么吗?
1. 我填写一个策略对象。
{ "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" }
  ]
}
  • "x-amz-meta-uuid"是什么,我在哪里可以找到它?
  • "x-amz-credential"节点中要写什么内容?

2. 我对策略对象进行base64编码。

3. 我制作了带有上传表单的HTML页面。

    <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>
  • 看起来表单输入的值与我在表单中引用的新创建的策略对象是相同的。那么为什么我还要填写两次?
1个回答

3

这并不是我问题的真正答案! - olefrank
抱歉我没有清楚地表述。我试图回答你的问题:“这种方法安全吗?不需要服务器来保证安全性,比如应用访问密钥等吗?”关键是你不直接将AWS访问密钥传递给浏览器,而是可以传递预签名URL,然后浏览器可以使用它来上传到S3。与你发布的那个方法相比,这是另一种更安全的方法。这个参考链接是一个很好的例子(https://www.terlici.com/2015/05/23/uploading-files-s3.html)。请注意:“s3.getSignedUrl”。 - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接