我是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
文件中设置。但在这里,我在代码中暴露它们。怎么避免呢?或者我应该设置一些存储桶权限吗?
答案 0 :(得分:3)
您应该never, ever直接在客户端代码中发送/公开AWS访问令牌。
将该代码放在服务器上并调用您的服务器代码,然后调用AWS。
在您的服务器上,您也不应该使用硬编码的访问密钥。正如亚历杭德罗在下面的answer中所述,使用环境变量来获取访问令牌。
答案 1 :(得分:3)
您可以使用在S3对象上公开的aws sdk getSignedUrl方法。这将允许您直接从客户端上传到您的存储桶,而不会暴露您的访问令牌。您可以将访问权限保存在.env文件中,并将该文件保留在您的存储库之外,从而使您的访问权限保持安全。
创建签名网址需要在服务器上创建一个返回签名网址的端点。从那里你将执行包含图像的放置请求。我用一个例子创造了一个要点。在要点中有客户端和服务器代码。 https://gist.github.com/pizza-r0b/35be6dd3e992ef1ebb2159772cb768c0
答案 2 :(得分:2)
强烈建议不要在客户端代码中存储永久凭据,以便将文件上传到S3。有几种方法可以安全地处理这个问题。
下面列出了很少的参考资料,以帮助您开始使用签名网址。
答案 3 :(得分:0)
只需拨打您的代码process.env.<YOUR_KEY>
。