从客户端浏览器直接上文件至 Amazon S3——私钥泄露

从客户端浏览器直接上文件至 Amazon S3——私钥泄露

<p>我从客户端浏览器通过 REST API 将文件直接上传到 Amazon S3,过程中仅使用了 JavaScript,无需任何服务器端代码。一切运行正常,但有一点让我担心…<br /> 当我向 Amazon S3 REST API 发送请求时,我需要对请求进行签名,并将签名放入 Authentication 标头中。我必须使用我的私钥来创建签名,但是,由于所有操作都在客户端进行,私钥容易从页面源中泄露(即使我混淆/加密了我的页面源)。<br /> 我该如何解决这个问题?这能算得上一个问题吗?我可以将特定私钥的使用限制为来自特定 CORS Origin 的 REST API 调用,以及 PUT 和 POST 方法,或者仅将密钥链接到 S3和特定存储桶。是否还有其他的身份验证方法?<br /> “无服务器”是一个理想的解决方案,但我考虑进行一些服务器端处理,而不是将文件上传到我的服务器然后发送到 S3。</p>
从客户端浏览器直接上文件至 Amazon S3——私钥泄露 2022-09-01 10:26:51
从客户端浏览器直接上文件至 Amazon S3——私钥泄露 0
从客户端浏览器直接上文件至 Amazon S3——私钥泄露
<p>我认为您想要的方法是“使用 POST 的基于浏览器的上传”。<br /> 总的来说,您确实需要服务器端代码,但它仅能够生成已签名的策略。一旦客户端代码具备签名策略,它就可以使用 POST 直接上传到 S3,而无需通过您的服务器。<br /> 这是官方文档链接:<br /> 图示:<br /> <ins><a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html" target="_blank">http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html</a></ins><br /> 示例代码:<ins><a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html" target="_blank">http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html</a></ins><br /> 签名的策略将按以下形式出现在您的 html 中:</p> &lt;html&gt; &lt;head&gt; ... &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt; ... &lt;/head&gt; &lt;body&gt; ... &lt;form action="http://johnsmith.s3.amazonaws.com/" method="post" enctype="multipart/form-data"&gt; Key to upload: &lt;input type="input" name="key" value="user/eric/" /&gt;<br /> &lt;input type="hidden" name="acl" value="public-read" /&gt; &lt;input type="hidden" name="success_action_redirect" value="http://johnsmith.s3.amazonaws.com/successful_upload.html" /&gt; Content-Type: &lt;input type="input" name="Content-Type" value="image/jpeg" /&gt;<br /> &lt;input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /&gt; Tags for File: &lt;input type="input" name="x-amz-meta-tag" value="" /&gt;<br /> &lt;input type="hidden" name="AWSAccessKeyId" value="AKIAIOSFODNN7EXAMPLE" /&gt; &lt;input type="hidden" name="Policy" value="POLICY" /&gt; &lt;input type="hidden" name="Signature" value="SIGNATURE" /&gt; File: &lt;input type="file" name="file" /&gt; <br /> &lt;input type="submit" name="submit" value="Upload to Amazon S3" /&gt; &lt;/form&gt; ... &lt;/html&gt; 请注意,FORM 操作会将文件直接发送到 S3(不通过您的服务器)。 每次您的用户想上传文件时,您都需要在服务器上创建策略和签名。您将页面返回到用户的浏览器。然后,用户可以将文件直接上传到 S3,而无需通过您的服务器。 签署策略时,一般会使策略在几分钟后时效。这样可以强制您的用户在上传之前与您的服务器通话。因此您可以根据需要监控和限制上传。 传入或传出服务器的唯一数据是签名 URL。您的密钥会秘密保存在服务器上。