如何保护javascript浏览器上传到AWS S3

时间:2015-06-16 16:06:04

标签: javascript security amazon-s3 upload cors

请原谅noob问题。我有一个基本的图像上传脚本,用于将文件发送到我的S3存储桶:

<body>
  <input type="file" id="file-chooser" /> 
  <button id="upload-button">Upload to S3</button>
  <div id="results"></div>
  <script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.34.min.js"></script> 
  <script type="text/javascript">
      AWS.config.update({accessKeyId: "XXXXXXXXXXXXXXXXXX", secretAccessKey: "XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXX"});

      var bucket = new AWS.S3({ params: { Bucket: 'XXXXXXXXXX'} });

      var fileChooser = document.getElementById('file-chooser');
      var button = document.getElementById('upload-button');
      var results = document.getElementById('results');
      button.addEventListener('click', function () {
          var file = fileChooser.files[0];
          if (file) {
              results.innerHTML = '';

              var params = { Key: file.name, ContentType: file.type, Body: file };
              bucket.upload(params, function (err, data) {
                  results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
              });
          } else {
              results.innerHTML = 'Nothing to upload.';
          }
      }, false);
  </script>
</body>

我也设置了CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

如果我将我的存储桶的权限设置为Everyone或Authenticated Users并在页面代码中包含访问密钥和密钥,则此页面可以正常工作。然而,暴露我的钥匙似乎是一个可怕的想法。并且这不会允许任何拥有访问密钥/密钥对的人上传到我的存储桶中吗?我怎样才能让这更安全?是否像将CORS配置中的AllowedOrigin更改为我的网站的IP一样简单?但是我的代码中仍然有密钥。

我使用带有编码策略和签名的form-POST方法尝试并失败了几天。我可以在没有身份验证(没有策略)的情况下工作,但是当我尝试包含加密策略时,我得到的是SignatureDoesNotMatch错误。另一个解决方案是在没有授权的情况下使用POST方法,并将CORS AllowedOrigin限制为我的网站IP,如上所述。这太简单了吗?

如果我不在这里,请告诉我。我知道AWS有很好的记录,但我觉得我错过了这个难题的关键部分。谢谢!

0 个答案:

没有答案