javascript - 从客户端浏览器直接上传 Amazon S3 文件 - 私钥泄露

标签 javascript amazon-web-services authentication amazon-s3

我正在通过仅使用 JavaScript 的 REST API 将文件从客户端机器直接上传到 Amazon S3,而无需任何服务器端代码。一切正常,但有一件事让我担心......

当我向 Amazon S3 REST API 发送请求时,我需要对请求进行签名并将签名放入 Authentication header 中。要创建签名,我必须使用我的 key 。但是所有事情都发生在客户端,因此, key 可以很容易地从页面源中泄露(即使我混淆/加密了我的源)。

我该如何处理?这真的有问题吗?也许我可以将特定私钥的使用仅限于来自特定 CORS Origin 的 REST API 调用以及仅限 PUT 和 POST 方法,或者可能仅将 key 链接到 S3 和特定存储桶?可能还有其他认证方式吗?

“无服务器”解决方案是理想的,但我可以考虑涉及一些服务器端处理,不包括将文件上传到我的服务器然后发送到 S3。

最佳答案

我认为您想要的是使用 POST 的基于浏览器的上传。

基本上,您确实需要服务器端代码,但它所做的只是生成签名策略。一旦客户端代码具有签名策略,它就可以使用 POST 直接上传到 S3,而无需通过您的服务器。

这是官方文档链接:

图表:http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html

示例代码:http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html

签署的政策会以如下形式进入您的 html:

<html>
  <head>
    ...
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    ...
  </head>
  <body>
  ...
  <form action="http://johnsmith.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    Key to upload: <input type="input" name="key" value="user/eric/" /><br />
    <input type="hidden" name="acl" value="public-read" />
    <input type="hidden" name="success_action_redirect" value="http://johnsmith.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" />
    Tags for File: <input type="input" name="x-amz-meta-tag" value="" /><br />
    <input type="hidden" name="AWSAccessKeyId" value="AKIAIOSFODNN7EXAMPLE" />
    <input type="hidden" name="Policy" value="POLICY" />
    <input type="hidden" name="Signature" value="SIGNATURE" />
    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>
  ...
</html>

请注意,FORM 操作将文件直接发送到 S3 - 而不是通过您的服务器。

每次您的用户想要上传文件时,您都需要在服务器上创建 POLICYSIGNATURE。您将页面返回到用户的浏览器。然后,用户可以直接将文件上传到 S3,而无需通过您的服务器。

当您签署政策时,您通常会使政策在几分钟后过期。这会迫使您的用户在上传之前与您的服务器交谈。这让您可以根据需要监控和限制上传。

进出您的服务器的唯一数据是签名的 URL。您的 key 在服务器上保密。

关于javascript - 从客户端浏览器直接上传 Amazon S3 文件 - 私钥泄露,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585881/

相关文章:

python - 在本地测试 Google Cloud 和 Azure 的应用程序

amazon-web-services - 控制 Lambda + Kinesis 成本

javascript - meteor : Stop login if email is unverified

java - 使用用户登录表单进行身份验证而不使用匿名登录表单进行身份验证的最佳方法

web-services - 是否可以使用 SoapUI 来测试 SPNEgo 保护的服务?

javascript - 使用 instanceof 和检查构造函数有什么区别?

javascript - 从 JavaScript 值分配模型属性值

javascript - 在 React 中渲染空白区域

javascript - jQuery AJAX 多次调用错误处理

amazon-web-services - 用于分配弹性 IP 的 AWS EC2 用户数据脚本