使用PHP在Amazon S3存储上的私有和安全文件

时间:2013-02-07 18:49:22

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

我只是想问一下是否有人可以给我一个提示,让S3上的私有和安全文件只能由登录用户访问,或者当业务逻辑希望它们可访问时。这是场景......

  

用于输入生成PDF的结算明细的PHP Web应用程序   即时发票并将其上传到S3存储桶。 (实际上   并不总是生成和上传 - 只有当用户想要打印或   下载它 - 代码生成一个pdf - 上传到S3并获取   相应地回复网址或文件)

现在,任何拥有S3存储桶文件URL的人都可以访问该文件。我想限制文件访问权限,使得那些甚至没有登录的人只有在让我们回答一个秘密问题之后才能获取该文件。

生成一个签名的网址,该网址在一小段时间内是唯一有效的答案,还是我在寻找其他可能性?另外,我们可以直接从S3生成签名的URL吗?还是我们需要通过cloudfront生成它?

建议我进一步研究的方向......谢谢!

2 个答案:

答案 0 :(得分:0)

这可能有帮助吗? Amazon CloudFront Private Content

我认为您需要设置VPC以确保您的用户凭据经过验证且有效,以保持内容“私密”。

答案 1 :(得分:0)

这篇文章https://css-tricks.com/snippets/php/generate-expiring-amazon-s3-link/可以帮到你。不要忘记查看评论。

***编辑

生成即将到期的Amazon S3链接

您不必在Amazon S3上公开文件(默认情况下不是这样)。但您可以生成特殊键以允许访问私有文件。这些密钥通过URL传递,可以使其过期。

<?php 

    if( !function_exists( 'el_crypto_hmacSHA1' ) ) {
        function el_crypto_hmacSHA1($key, $data, $blocksize = 64) {
                if (strlen($key) > $blocksize) $key = pack('H*', sha1($key));
                $key = str_pad($key, $blocksize, chr(0x00));
                $ipad = str_repeat(chr(0x36), $blocksize);
                $opad = str_repeat(chr(0x5c), $blocksize);
                $hmac = pack( 'H*', sha1(
                ($key ^ $opad) . pack( 'H*', sha1(
                    ($key ^ $ipad) . $data
                ))
            ));
                return base64_encode($hmac);
        }
    }

    if(!function_exists('el_s3_getTemporaryLink')){

        function el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
            // Calculate expiry time
            $expires = time() + intval(floatval($expires) * 60);
            // Fix the path; encode and sanitize
            $path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
            // Path for signature starts with the bucket
            $signpath = '/'. $bucket .'/'. $path;
            // S3 friendly string to sign
            $signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
            // Calculate the hash
            $signature = el_crypto_hmacSHA1($secretKey, $signsz);
            // Glue the URL ...
            $url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
            // ... to the query string ...
            $qs = http_build_query($pieces = array(
                'AWSAccessKeyId' => $accessKey,
                'Expires' => $expires,
                'Signature' => $signature,
            ));
            // ... and return the URL!
            return $url.'?'.$qs;
        }
    }

用法

<?php

    echo el_s3_getTemporaryLink('your-access-key', 'your-secret-key', 'bucket-name', '/path/to/file.mov');