实现它的一个好方法是生成只能上传到特定存储桶部分(用户有权访问的部分)的临时凭证。
即使这些凭据从内存中被盗(我假设您在每次通信中都使用 https,因此它们在传输过程中不会被盗),最终用户也只能将它们用于预期用途:上传文件。
此处提供了一个示例
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":"s3:PutObject",
"Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
},
{
"Effect":"Deny",
"NotAction":"s3:PutObject",
"Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
},
{
"Effect":"Deny",
"Action":"s3:*",
"NotResource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*"
}
]
}
我建议您还通过验证允许的扩展名/文件签名定期检查存储桶中的所有文件(小心,这可能会变得非常耗时)。您还可以根据文件扩展名更多地限制您的策略(来源此处)
{
"Id": "Policy1464968545158",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1464968483619",
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<yourbucket>/*.jpg",
"Principal": "*"
},
{
"Sid": "Stmt1464968543787",
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<yourbucket>/*.png",
"Principal": "*"
}
]
}