【发布时间】:2019-03-23 09:32:05
【问题描述】:
我正在使用适用于 PHP 的 AWS 开发工具包向我的 S3 存储桶上传和显示文件。
这些文件应该只能通过我的网站访问,不允许其他引荐来源 - 不允许盗链等。
我还需要能够复制存储桶中的对象。
我照常创建和连接:
$s3Client = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'eu-west-2'
]);
$s3 = $s3Client::factory(array(
'version' => 'latest',
'region' => 'eu-west-2',
'credentials' => array(
'provider' => $provider,
'key' => $key,
'secret' => $secret
)
));
并执行复制对象命令:
$s3->copyObject([
'Bucket' => "{$targetBucket}",
'Key' => "{$targetKeyname}",
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
]);
我尝试了使用“允许 if string like referrer”的策略,但 AWS 然后告诉我我允许公共访问?!?!? 一切正常,即使是 copyObject 操作,但仍然可以直接从任何地方访问文件!
我尝试使用“拒绝如果字符串不像推荐人”,它主要按预期工作 - 我可以上传和显示文件,并且直接链接时文件不显示(这是我想要的) - 但是,copyObject 操作不再工作,我收到拒绝访问错误。
我已经尝试了我能想到的所有其他方法,并花了数小时在谷歌上搜索和寻找答案,但无济于事。
这是每个单独的政策...
如果字符串 LIKE referrer,则只允许文件访问 (GetObject):
{
"Version": "2008-10-17",
"Id": "",
"Statement": [
{
"Sid": "Deny access if referer is not my site",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::MY-BUCKET/*"
],
"Condition": {
"StringLike": {
"aws:Referer": [
"http://MY-SITE/*",
"https://MY-SITE/*"
]
}
}
}
]
}
结果:上传和复制对象工作,但文件仍然可以在任何地方访问
如果字符串 NOT LIKE referrer,则拒绝所有操作 (*):
{
"Version": "2008-10-17",
"Id": "",
"Statement": [
{
"Sid": "Deny access if referer is not my site",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::MY-BUCKET/*"
],
"Condition": {
"StringNotLike": {
"aws:Referer": [
"http://MY-SITE/*",
"https://MY-SITE/*"
]
}
}
}
]
}
结果:copyObject 操作不再起作用,我收到拒绝访问错误
【问题讨论】:
标签: php amazon-s3 policy referrer bucket