ActiveStorage使通过JS中的用户浏览器直接在S3上上传和访问文件成为可能。这是否意味着您的S3凭据嵌入到用户浏览器中?我想我误解了,这会让你的资历几乎公开.
在这种情况下,唯一阻止任何人访问其他用户数据的是唯一令牌生成。但是24字节的随机密钥很容易被强暴。我是否应该通过实现与自己数据相关的每个用户的唯一密钥来加强安全性?
什么是好的安全架构?
发布于 2018-08-30 13:37:25
一个很好的安全体系结构(也许这就是在ActiveStorage中实现的)是:
1-包括上传表格在内的网页被要求。
2-一个blob记录将在服务器端创建并持久化到数据库(甚至在任何上传发生之前)。存储/bob.rb#L70
3-服务器调用第三方云服务(AWS S3表示ex.)在后端,并使用AWS凭据(秘密凭据,不应公开)发出预先签名的url,用于上传。service.rb#L87
4-服务器呈现带有表单和嵌入presigned_url的页面。
5-此时的前端将在服务器上生成presigned_url并呈现到表单中。
Javascript将从html DOM中捕获这个presigned_url并使用它进行上传。
7-上传后,javascript将有signed_id,它将以表单形式发布到后端,以更新blob记录并将其标记为上载(step1中创建的blob记录)。
Pros
1-您不需要通过服务器上传任何文件,这意味着在上传过程中没有阻塞任何进程,并且使用客户端计算能力来处理这样简单的任务。
2-你可以上传,即使后端是下降。
3-更快的用户体验(减少往返旅行)。
Cons
1-临时令牌可以被任何访问它的人使用来上传。
2- presigned_url具有有效期(expires_at),如果浏览器在进行实际上传之前一直处于空闲状态,那么浏览器很可能会出现错误。它可能需要从服务器发出一个新的临时令牌!?
注意:
这就是signed uploads的工作方式:)
发布于 2018-08-30 12:57:33
您的S3凭据应该保存为环境变量在您的回购,而不是硬编码。在Hartls图书Rails教程中有一个例子。
发布于 2018-08-30 13:24:22
当您将ActiveStorage与S3结合使用时。您需要将凭据存储在这样的环境变量中
您需要创建一个文件storage.yml
amazon:
service: s3
access_key_id: ENV["AWS_ACCESS_KEY_ID"]
secret_access_key: ENV["AWS_SECRET_KEY"]
region: ENV["AWS_REGION"]
bucket: ENV["S3_BUCKET"]https://stackoverflow.com/questions/52097364
复制相似问题