【问题标题】:how to determine s3 browser upload policy expiration duration如何确定s3浏览器上传策略过期时长
【发布时间】:2015-09-24 09:26:29
【问题描述】:

我已将基于服务器的 s3 上传移动到从浏览器直接上传到 s3,我正在设置上传策略,但有些过期。

$policy = array(
            'expiration' => gmdate('Y-m-d\TG:i:s\Z', strtotime('+10 minutes')),
            'conditions' => array(
                    array('bucket' => Configure::Read('s3upload.s3bucket')),
                    array('acl' => 'private'),
                    array('starts-with', '$key', ''),
                    array('success_action_redirect' => $success_action_redirect),
                    array('starts-with', '$Content-Type', ''),
                    array("content-length-range", 0, 16*1024*1024) //16 mb
            )
    );

我需要在表单数据中传递 AWSAccessKey、编码策略、签名,这可能会影响虚假上传(我对此也有疑问)。

为了避免被利用,我应该设置最短过期时间?但作为客户端,无法确定文件大小和连接速度。

我已经尝试过 10 秒过期和大文件上传来验证,我观察到所有上传尝试都出现策略过期错误,

<Error> <Code>AccessDenied</Code> <Message>Invalid according to Policy: Policy expired.</Message> <RequestId>2178D49CAA739EB3</RequestId> <HostId>id=</HostId> </Error>

但由于我的 WI-FI 连接经常断开,所以我无法确定正确的行为,但通过稳定的局域网连接,我可以上传具有较小策略到期时间的大文件。

我应该如何确定保单到期的正确到期值?

【问题讨论】:

    标签: file-upload amazon-s3


    【解决方案1】:

    不要这样做。

    array('starts-with', '$key', ''),
    

    这允许通过操作表单来覆盖存储桶中的任何文件。将确切的密钥放在将文件上传到策略中的位置。如果他们拥有签名,那么任何人所能做的最糟糕的事情就是覆盖同一个文件。

    但是,如果您的站点使用 SSL,而 S3 表单发布使用 SSL,则此信息被泄露的可能性非常小。

    另请注意,如果表单帖子的行为类似于已签名的 GET 请求,则过期持续时间应该仅在上传开始之前很重要。一旦它运行起来,它应该能够在到期后完成而不会导致错误,只要它在到期之前启动。我假设 S3 在收到标头时对请求进行身份验证,但表单发布上传可能不是这样?您是否发现情况并非如此?

    【讨论】:

    • 感谢迈克尔指出,我相信表单后身份验证的行为相同,因为我能够上传设置了 10 秒到期的大文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2015-06-15
    • 2013-10-30
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多