【问题标题】:Private and Secure Files on Amazon S3 Storage with PHP使用 PHP 在 Amazon S3 存储上的私有和安全文件
【发布时间】:2016-11-15 19:21:09
【问题描述】:

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

一个 PHP Web 应用程序,用于输入生成 PDF 的帐单详细信息 即时开具发票并将其上传到 S3 存储桶。 (其实是 并不总是生成和上传 - 仅当用户想要打印或 下载它 - 代码生成一个 pdf - 将其上传到 S3 并获取 相应地返回 url 或文件)

现在,任何拥有 S3 存储桶上文件的 URL 的人都可以访问该文件。我想以这样一种方式限制文件访问,即使没有登录的人只有在回答一个秘密问题等之后才能获得文件。

生成一个在短时间内有效的签名网址是这里唯一的答案,还是我也在寻找其他可能性?另外,我们可以直接从 S3 生成签名的 url,还是需要通过 cloudfront 生成?

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

【问题讨论】:

  • 访问控制列表或查询字符串身份验证听起来很可能
  • 我已经尝试过查询字符串身份验证,是的 - 它有点工作......

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


【解决方案1】:

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

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

【讨论】:

  • 场景是保护私有存储解决的文件,然后提供签名的 url 用于下载和打印文件。现在问题仍然是附加它们并将它们安全地邮寄给用户......
  • @foxybagga 邮寄给他们......就像在蜗牛邮件中一样?
  • 嗯,我的意思是给他们发电子邮件。假设管理员想向用户发送发票,他将如何发送 - 如果他通过签名链接发送 - 它就会过期。
  • @foxybagga 我不确定 Amazon S3 是否能满足您的预期目的。通常这种事情需要一个点击链接(每封电子邮件不安全)链接回您的网络服务器,这将检查他们当前的身份验证状态,或者如果他们已经登录,则通过。您需要安全的文档可以由您的网络服务器自动生成,如果它是动态的,则实际上不需要存储在任何地方。我不确定您的功能规范是否需要 S3 VPC。如果没有,我会不去。
  • 啊,谢谢你提醒我——我可以做的是发送一个链接到我的网络服务器上的一个页面,并要求用户进行身份验证并下载可能包含出生日期等的文件......跨度>
【解决方案2】:

这篇文章 https://css-tricks.com/sn-ps/php/generate-expiring-amazon-s3-link/ 可以帮助你。不要忘记检查 cmets。

*** 编辑

生成即将过期的 Amazon S3 链接

您不必公开 Amazon S3 上的文件(默认情况下不公开)。但是您可以生成特殊密钥以允许访问私有文件。这些密钥通过 URL 传递,并且可以设置为过期。

&lt?php

    如果(!function_exists('el_crypto_hmacSHA1')){
        函数 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) 。包('H *',sha1(
                    ($key ^ $ipad) 。 $数据
                ))
            ));
                返回 base64_encode($hmac);
        }
    }

    if(!function_exists('el_s3_getTemporaryLink')){

        函数 el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
            //计算过期时间
            $expires = time() + intval(floatval($expires) * 60);
            // 修复路径;编码和消毒
            $path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
            // 签名路径以bucket开头
            $signpath = '/'。 $bucket .'/'。 $路径;
            // 要签名的 S3 友好字符串
            $signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
            // 计算哈希
            $signature = el_crypto_hmacSHA1($secretKey, $signsz);
            // 粘贴 URL ...
            $url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
            // ... 到查询字符串 ...
            $qs = http_build_query($pieces = array(
                'AWSAccessKeyId' => $accessKey,
                '过期' => $过期,
                '签名' => $签名,
            ));
            // ... 并返回 URL!
            返回 $url.'?'.$qs;
        }
    }

用法

【讨论】:

  • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
猜你喜欢
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2018-12-04
  • 2021-12-02
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多