S3,在PHP中验证签名的URL,解构签名的URL

时间:2016-07-03 10:35:24

标签: php amazon-web-services amazon-s3 signature

我使用s3直接上传和数据库来存储文件的URL(以及其他数据,如谁上传等)。 为了允许直接上传到s3,我正在创建一个预先签名的URL,如:

$s3 = App::make('aws')->createClient('s3', [
            'credentials' => [
                'key' => 'AAAAAAAAAAAAAAA',
                'secret' => 'YYYYYYYYYYYYYYYYYYYY',
            ]

        ]);


 $command = $s3->getCommand('PutObject', [

            '@use_accelerate_endpoint'=>true,
            'Bucket' => 'remdev-experimental',
            'Key' => "newest newest.txt",
            'Metadata' => array(
                'foo' => "test",
            )
        ]);



        return response()->json(((string)$s3->createPresignedRequest($command, '+1 minutes')->getUri()));

现在,在客户端的文件上传完成后,我希望我的服务器知道它。因此,我将要求客户向我发送请求,通知他已完成上传。为此,我认为最简单(也是安全)的方法是允许客户端发送回刚刚发回的签名URL。

有没有办法解析网址? 我对获取对象密钥感兴趣,更重要的是,我想验证URL是否未被篡改(意味着,URL中的签名应与其余内容匹配)。我怎么能在php sdk中做到这一点?

1 个答案:

答案 0 :(得分:1)

签名的URL是文件的URL,其中包含查询数据中的签名信息。因此,已签名的存储区请求:remdev-experimental文件:abc.txt看起来像https://s3.amazonaws.com/remdev-experimental/abc.txt?X-Amz-Date=date&X-Amz-Expires=60&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=signature&X-Amz-Credential=SOMEID/20160703/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=some-long-token所以您需要做的就是获取网址的路径/remdev-experimental/abc.txt并获取所有内容在第二次斜线之后。

另外,您应该知道,您可以使用HTTP post policy

中的success_action_redirect将浏览器重定向到网址

最后,只要上传文件,您就可以让S3触发通知您的服务器(通过SQS,SNS或Lambda)。