【问题标题】:AWS S3 get images via Proxy - PHPAWS S3 通过代理获取图像 - PHP
【发布时间】:2018-06-12 17:50:35
【问题描述】:

我在 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 图像。

【问题讨论】:

  • "我不想让 CSS 和图像公开访问。" 那么浏览器如何使用它们呢?每个网站 css\images\js 都必须可由用户浏览器访问,网站才能正常工作
  • 如果他们想通过 s3 url 直接访问,我不想让他们访问该图像。私人图像怎么样
  • “私人”内容可以通过两种方式直接从 S3 访问;通过 1) 具有属于存储桶所有者的客户端秘密凭据的服务器进程,或 2) 直接由浏览器获取访问请求,该访问请求由您的服务器使用客户端密钥凭据进行加密签名。后者使用 javascript 请求(通常是异步 XMLHTTPRequest)执行,首先到您的服务器进行签名,然后到 S3 获取内容。
  • @HituBansal 可以,但不要将此配置与实际保护此内容混淆。所有这一切都使盗链变得更加困难。任何技能水平不高的人都可以轻松绕过这一点并下载您的对象……这只会使其他网站难以通过在未经您许可的情况下链接到您的内容来窃取您的带宽。这里的问题似乎是请求不符合您的期望。检查请求标头、浏览器中的错误控制台和 S3 访问日志,并报告您发现的内容。
  • @shukshin.ivan 好吧,因为您显然不了解 AWS API 中的 S3 类是如何工作的。也不是基本的下载和保留代理如何工作......

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


【解决方案1】:

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

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

下载文件
$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>";
}

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

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

【讨论】:

  • 是的,但是上面代码中 'proxy' => '192.168.16.1:10' 的目的是什么..
  • @HituBansal 这用于来自服务器的出站连接,因此它通过外部互联网代理进行,就像大多数公司网络一样。例如,我可以使用交换机路由器连接到互联网,或者我可以通过调制解调器将机器放在该互联网连接上。那台机器然后充当另一个网卡的 DHCP 服务器,因此它是自己的内部网络,这意味着 DHCP 网络上的东西无法访问互联网,直到我在使用该服务器互联网连接的机器上启动代理服务于 DHCP 网络这就是代理应该如何工作的。去了解什么是代理服务器
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2018-11-28
相关资源
最近更新 更多