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

Hit*_*sal 14 php amazon-s3 aws-php-sdk aws-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)
            ]
        ]);
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以告诉我如何使用代理绕过S3图像.

Bar*_*n01 4

如果我理解正确,您想为您的图像设置一个保留代理,例如您的系统下载图像发送到浏览器,以便它可以渲染它们,并且您不希望用户知道您的路径/您不希望公开对您的存储桶的读取访问权限。

如果是这种情况,您可以使用以下代码通过以下方式下载文件

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

header("Content-Type: {$result['ContentType']}");
echo $result['Body'];
Run Code Online (Sandbox Code Playgroud)

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

如果您使用 MySQL 表来使用查找,那么将$id = $_GET['id'];创建一个函数来防止 SQL 注入并返回列,key然后将其用于您的$keyname示例表 $keyname,并且可以通过映射数据库表 EG 设置

CREATE TABLE `proxy_map`(
   `id` INT(11) NOT NULL PRIMARY KEY,
   `key` TEXT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

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

$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>";
}
Run Code Online (Sandbox Code Playgroud)

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

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