Я использую AWS SDK для PHP для загрузки и отображения файлов в / из моей корзины 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}",
]);
Я пробовал политику, использующую «Разрешить, если строка похожа на реферер», но затем AWS сообщает мне, что я разрешаю публичный доступ?!?!?
Все работает просто отлично, ДАЖЕ действие copyObject, но файлы по-прежнему доступны напрямую и отовсюду!
Я пытаюсь использовать «Запретить, если строка не похожа на реферер», которая работает в основном так, как ожидалось - я могу загружать и отображать файлы, а файлы не отображаются при прямой ссылке (что я и хочу) - однако, действие copyObject больше не работает, и я получаю сообщение об отказе в доступе.
Я пробовал все остальное, что мог придумать, и часами гуглял и искал ответы, но безрезультатно.
Вот каждая отдельная политика ...
РАЗРЕШИТЬ ТОЛЬКО ДОСТУП К ФАЙЛУ (GetObject), если строка 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": {
"StringLike": {
"aws:Referer": [
"http://MY-SITE/*",
"https://MY-SITE/*"
]
}
}
}
]
}
РЕЗУЛЬТАТ: загрузка и копирование объекта работают, но файлы по-прежнему доступны везде
ОТКЛОНИТЬ ВСЕ ДЕЙСТВИЯ (*), если строка NOT LIKE, ссылка:
{
"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 больше не работает, и я получаю сообщение об ошибке отказа в доступе