gpt4 book ai didi

javascript - AWS 从客户端上传文件到 S3

转载 作者:搜寻专家 更新时间:2023-10-31 23:30:35 24 4
gpt4 key购买 nike

我知道有人对此有一些疑问。我知道如何使用 AWS SDK 完成此操作。

但是,我担心的是安全问题。我的计划是生成一个签名 URL,以便登录我网站的用户可以将文件上传到 S3。我在服务器端生成这个 url(基于 Express 框架)。

问题:有权访问此 URL 的任何人都可以将文件上传到我的存储桶。只有登录用户才能获得这些 url,但任何人都可以使用它们。

有没有一种方法可以生成一个“一次性使用”的 url 来使用 S3 进行身份验证?如果没有,是否有一种我可以使用的方法不会在客户端显示我的凭据并且不会将文件上传到我的服务器?(我知道,要求太多了:/)

最佳答案

请求需要认证

除非您使您的资源公开可写,否则 S3 将要求上传请求包含身份验证信息。身份验证将请求与 AWS 帐户相关联,然后检查该帐户是否有权对资源执行请求(授权)。

参见 AWS documenation有关更多信息的身份验证请求。

用于生成身份验证信息的算法的最新版本称为“AWS 签名版本 4”。该算法使用帐户的 key 和其他一些数据来生成随请求一起发送的签名。

AWS 知道 key 并且可以重新计算签名。如果签名匹配,则请求被验证为来自该帐户。

AWS 开发工具包负责使用提供的账户凭证为您签署请求。 The docs描述了该算法的工作原理,并告诉您如果您真的愿意,可以如何自己签署请求。

在服务器端签署 S3 请求

您可以代表客户端在服务器上安全地生成一个签名的 URL,然后将其返回以供他们直接调用 S3,而不是在客户端保留一个 key ,以便它可以对向 S3 发出的请求进行签名从他们的机器。

此场景是 the docs 中提到的特定用例之一:

[P]re-signed URLs are useful if you want your user/customer to be able upload a specific object to your bucket, but you don't require them to have AWS security credentials or permissions.

When you create a pre-signed URL, you must provide your security credentials, specify a bucket name an object key, an HTTP method (PUT of uploading objects), and an expiration date and time.

The pre-signed URLs are valid only for the specified duration.

预签名请求安全

预签名请求中包含身份验证签名。如您所述,任何获得 URL 的人都可以发出请求。但是,我不会让这个事实单独阻止我使用它们;您可以采取多种措施来防止攻击者使用它。

考虑以下客户端和服务器之间的交互。

Direct File Upload to S3 Sequence Diagram

请求到期

在 URL 生成时使用 Expires Parameter 控制过期.使用上述流程,URL 可能会在生成后几秒 过期。这段时间之后,它将不再有效并被 S3 拒绝。设置到期时,您需要考虑服务器与用户(步骤#5-#7)以及用户与 S3(步骤#8)之间的请求延迟。

在签名中包含文件校验和

使用 Body Parameter您可以指示 S3 仅允许具有特定 MD5 校验和的内容。同样,但更安全的是,您可以要求 S3 根据文件的 SHA256 校验和验证负载。

在上述流程中的第 3 步之后,计算文件的 SHA256 校验和,并在第 4 步中将其传递给服务器。然后你可以像这样将它添加到请求中:

var req = S3.putObject({ Bucket: bucket_name, Key: file_name });
req.on('build', function() {
req.httpRequest.headers['x-amz-content-sha256'] = file_sha256;
});
var url = req.presign(url_expiry);

(引用:AWS.Request class docsAWS S3 service source code - getSignedUrlREST Common Request Headers)

获取上传URL需要身份验证

只有您的授权用户才能获得预签名的上传 URL。应拒绝获取上传 URL 的匿名请求(第 4 步)。

此外,由于这是一个特权调用,所有请求都应该被审计(步骤#6)。这样一来,如果预签名的请求泄露,您就会知道是谁生成的,并且可以在必要时采取进一步的行动。

使用 HTTPS

两个主要原因,为敏感数据提供保护,例如在客户端和服务器之间传输时的预签名 URL、用户名、密码和 session cookie。

它还向客户保证您就是您所说的那个人,而不是攻击者建立的虚假网站。

关于javascript - AWS 从客户端上传文件到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com