2

我对 AWS 完全陌生,并且遇到了一些安全问题。

我想允许我的用户上传个人资料图片并将其保存在 S3 中。我的代码如下所示:

import AWS_S3 from 'aws-sdk/clients/s3';
import config from '../../config';

const myS3Credentials = {
  accessKeyId: config('AWSS3AccessKeyID'),
  secretAcccessKey: config('AWSS3SecretAccessKey'),
};

console.log('myS3Credentials:', myS3Credentials);

const S3 = new AWS_S3({
  credentials: myS3Credentials,
  region: config('AWSS3Region'),
});

所有变量(如AWSS3Region和我的凭据)都在.env文件中设置。但是在这里,我将它们暴露在代码中。如何避免这种情况?还是我应该设置一些存储桶权限?

4

4 回答 4

3

您可以使用在 S3 对象上公开的 aws sdk getSignedUrl 方法。这将允许您直接从客户端上传到您的存储桶,而不会暴露您的访问令牌。您可以通过将访问令牌保留在 .env 文件中并将该文件保留在您的存储库之外来保持访问令牌的安全。

创建签名 URL 需要在您的服务器上创建一个端点,该端点将返回签名 URL。从那里您将执行包含图像的放置请求。我用一个例子创建了一个要点。在要点中有客户端和服务器代码。https://gist.github.com/pizza-r0b/35be6dd3e992ef1ebb2159772cb768c0

于 2017-09-22T15:59:33.593 回答
3

永远不应该直接在您的客户端代码中发送/公开 AWS 访问令牌。

将该代码放在服务器上并调用您的服务器代码,然后再调用 AWS。

在您的服务器上,您也不应该使用硬编码的访问密钥。正如 Alejandro 在下面的回答中所说,使用环境变量来获取访问令牌。

于 2017-09-22T15:52:03.033 回答
2

强烈建议不要在客户端代码中存储永久凭据以将文件上传到 S3。有几种方法可以安全地处理这个问题。

  • 使用 AWS STS SDK 或使用AWS Cognito等服务从您的后端获取临时访问凭证。
  • 使用 AWS CloudFront签名 URL签名 Cookie从服务器发送回客户端,以便您可以使用它们将文件上传到 S3。

下面列出了一些参考资料,可帮助您开始使用签名网址。

于 2017-09-22T16:02:03.803 回答
0

只需调用您的代码process.env.<YOUR_KEY>

于 2017-09-22T15:49:27.350 回答