这是在客户端使用 aws-sdk 的安全方法吗?

问题描述 投票:0回答:1

我读过不同的意见,所以我想要专家的意见。我的问题很基本: 如果我创建一个 React 应用程序(仅客户端),从我计划读取 s3 对象的地方,以下是安全的方法还是我的凭据会以某种方式暴露?我的 env 变量只会存储在 Netlify 中。

我问这个问题是因为我有类似的设置,并且我的 AWS 受到了损害(但我不确定这种方法是否就是原因)。

aws-exports.js

import { config } from 'aws-sdk'
const AWSConfig = {
    accessKeyId: process.env.REACT_APP_AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.REACT_APP_AWS_SECRET_ACCESS_KEY,
    region: process.env.REACT_APP_AWS_REGION,
}
config.update(AWSConfig)

s3.js

import { S3 } from 'aws-sdk'

class S3Singleton {
    static instance = undefined
static async getInstance() {        
        if (S3Singleton.instance) {
            return S3Singleton.instance
        }
        S3Singleton.instance = await S3Singleton.createInstance()
        return S3Singleton.instance
    }
static createInstance = async () => {
        return new S3({
            apiVersion: process.env.REACT_APP_AWS_API_VERSION,
            region: process.env.REACT_APP_AWS_REGION,
            params: { Bucket: process.env.REACT_APP_AWS_BUCKET },
        })
    }
}
export default S3Singleton

s3对象读取

import S3Singleton from './s3'

export const getXFile = async () => {
  try {
    const s3 = await S3Singleton.getInstance()

    return await new Promise((resolve, reject) => {
      s3.getObject(
        {
          Bucket: process.env.REACT_APP_BUCKET,
          Key: "xfile.json",
        },
        (err, data) => {
          if (err) reject(err)
          if (data) resolve(JSON.parse(data.Body.toString()))
        },
      )
    })
  } catch (e) {
    console.log(e)
  }
}
amazon-s3 aws-sdk aws-sdk-js
1个回答
0
投票

如果您有一个使用任何类型的凭据连接到 API 的客户端应用程序,则这些凭据是客户端应用程序的一部分,应被视为“泄露”。有多种方法可以通过不同程度的努力从客户那里提取这些凭据。

我将“泄露”放在引号中,因为这取决于您使用这些凭据获得的权限。如果可以将您的凭据限制为仅允许用户执行的用例,那么用户是否可以提取它们并不重要。如果他可以将他的权限升级到比他应该能够做的更多,那么它就不安全,你需要添加另一层。

它不取决于您如何处理这些凭据,因为客户端仍然必须能够读取和使用这些凭据,因此该客户端的任何用户都能够执行相同的操作。 (只是付出或多或少的努力;-))

© www.soinside.com 2019 - 2024. All rights reserved.