AWS S3通过代理获取图像 - PHP

时间:2018-01-03 03:44:07

标签: php amazon-s3 aws-sdk aws-php-sdk

我在S3上有一个桶,我已经上传了图像。 现在我使用AWS-SDK获取图像。现在我想通过代理商绕过图像

$client = new Aws\S3\S3Client([
            'version'     => 'latest',
            'region'      => 'us-east-1',
            'debug'       => TRUE, // enable debug info
            'stats'       => TRUE, // enable stats
            '@http'  => [
            'proxy' => 'http://192.168.16.1:10'
            ],
            'credentials' => [
                'key'    => base64_decode(KEY),
                'secret' => base64_decode(SECRET)
            ]
        ]);

这是我的存储桶设置,当我执行wireshark时,它仍然在请求中显示AWS IP地址。

有人能告诉我如何使用代理绕过S3图像。

1 个答案:

答案 0 :(得分:3)

如果我理解正确你想要为你的图像设置一个保留代理EG你的系统会下载发送到浏览器的图像,以便它们可以呈现它们,你不希望用户知道你的路径/你不知道想要在你的桶上进行公共读取访问。

如果是这种情况,您可以使用以下代码通过

下载文件
$result = $client->getObject(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
));

header("Content-Type: {$result['ContentType']}");
echo $result['Body'];

然后可以使用密钥作为参数在特定URL上进行设置,或者如果您的存储桶已正确保护,您可以通过GET EG URL image.php?key=some/key/on/aws.jpg使用密钥名称并在内部使用$keyname = $_GET['key']你的档案。

如果您使用MySQL表来使用查找,它将是$id = $_GET['id'];并创建一个防止SQL注入的函数并返回key列,然后将其用于$keyname一个示例表就是 $keyname,可由映射数据库表E.G

设置
CREATE TABLE `proxy_map`(
   `id` INT(11) NOT NULL PRIMARY KEY,
   `key` TEXT NOT NULL
)

如果您想限制它,只有这个特定网站可以使用它,您可以使用引荐来源检查

$url = parse_url($_SERVER['HTTP_REFERER'] , PHP_URL_HOST);
if($url !== $_SERVER[HTTP_HOST]){ // assuming that the images are only loaded on the same site as this php script
    http_response_code(404);
    echo "<h1>File Not Found</h1><p>Sorry the file you were looking for could not be found</p>";
}

如果您希望允许来自一组网站E.G的图像,您可以使用子域设置。

$url = parse_url($_SERVER['HTTP_REFERER'] , PHP_URL_HOST);
$allowedDomains = array(
    $_SERVER[HTTP_HOST],
    "www.example.com"
);
if(!in_array($url, $allowdDomains))