当前位置: 首页 > 面试题库 >

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

刘阳荣
2023-03-14
问题内容

我正在使用REST API通过REST API实现从客户端计算机到AmazonS3的直接文件上传,而没有任何服务器端代码。一切正常,但有一件事让我担心。

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

我该如何处理?这是一个问题吗?也许我只能将特定私钥的使用限制为仅来自特定CORS Origin的RESTAPI调用,以及仅PUT和POST方法,或者仅将密钥链接到S3和特定存储桶?可能还有另一种身份验证方法?

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


问题答案:

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

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

签名的策略将以如下形式进入您的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。您的秘密密钥在服务器上保持秘密。



 类似资料:
  • 我只使用JavaScript,不使用任何服务器端代码,通过REST API实现了从客户机到AmazonS3的直接文件上载。一切正常但有一件事让我担心... 当我向AmazonS3 REST API发送请求时,我需要对请求进行签名,并将签名放入头中。要创建签名,我必须使用我的密钥。但是所有的事情都发生在客户端,所以,秘密密钥可以很容易地从页面源(即使我混淆/加密我的源)泄露出来。 我该怎么处理?这真

  • 我们目前有一个小的web应用程序,其中一部分是文件上传。目前,我们在客户端上使用Plupload,并启用了分块功能,以允许上传大型文件。这些文件被保存在应用服务器上,当它们出现时,这些块被追加。 现在,我们正在使用AmazonS3来存储文件,并有可能使用多个应用服务器。我发现很难处理这些大块。我试着以他们为榜样,但我遇到了问题。我尝试的主要内容是这样的: 我的问题是我需要知道上传的块。当我从上传的

  • 是否可以创建一个html表单,允许Web用户直接将文件上传到azure blob store,而不使用其他服务器作为中介?S3和GAW blob store都允许这样做,但我找不到对azure blob存储的任何支持。

  • 有谁能告诉我,是否可以直接将文件上传到blob容器,而无需通过我的web服务器进行路由?我在考虑某种客户端JS/jQuery脚本或第三方上传模块,将文件直接流式传输到blob容器。 在Amazon S3中,我使用了一个名为Flajaxian Direct Uploader的组件来实现这一点。 我需要将zip文件上传到一个大小为50MB到200MB的Azure blob容器中,通过web服务器的路由

  • 问题内容: 是否有从客户端浏览器获取时区的可靠方法?我看到了以下链接,但我想要一个更强大的解决方案。 使用JavaScript自动检测时区 JavaScript中的时区检测 问题答案: 查看此存储库pageloom很有帮助 下载jstz.min.js并将功能添加到您的html页面 然后从您的显示代码调用此函数

  • 我试过XMLHttpRequest的PUT请求。有一个浏览器端的限制,不允许我上传大于2GB的文件。然后我尝试了一个不需要Javascript端预处理的超文本标记语言表单的POST请求。它在一次操作中有5GB的上传大小限制。 AWS建议在较大的上传场景中进行多部分上传。这需要将文件分成小块,然后上传成小块。当文件大小大于10GB时,如何从浏览器中正确地执行此操作。