防止亚马逊S3文件的热链接?

tim*_*son 13 php amazon-s3 referrer amazon-web-services hotlinking

我想允许任何人玩位于我S3的视频在我的网站作为src一个<video>标签,但不会让人们使用它作为一个src在他们的网站直接键入网址到浏览器栏播放视频.

希望别人这样做:

在此输入图像描述

我不希望以下HTML出现在http:// your -site.com上,但仅限于http:// my -site.com:

<html>
    <video src="https://s3.amazonaws.com/my-bucket/my-video.mp4"></video>
</html>
Run Code Online (Sandbox Code Playgroud)

我已经看到了一些SO链接,但我想用代码说话,因为我无法使这些解决方案适合我.

这是我目前无法正常工作的存储桶策略:

{
"Version": "2008-10-17",
"Statement": [
    {
        "Sid": "AllowPublicRead",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::my-bucket/*",
        "Condition": {
            "StringLike": {
                "aws:Referer": [
                    "https://my-site.com/*"
                ]
            }
        }
    }
  }
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 为了测试我的存储桶策略,我将上面的HTML放在我的localhost上的测试文件中,并确定我可以通过键入来访问该视频http://localhost/test.html.为什么我的桶政策不能阻止这种情况?(我只想让它起作用http://my-site.com/test.html)
  2. 为了防止人们将s3 URL输入浏览器栏,我想我需要一个独立的存储桶策略解决方案,因为我不清楚AWS文档中如何防止通过浏览器直接访问.我想要散列网址让人难以猜测.也许有些方法可以使用AWS桶策略或其他解决方案?

为了更清楚,我的文件存储在s3上,但它们由亚马逊的CloudFront提供.所以我的CloudFront url src目前是media.my-site.com/my-video.mp4.CNAME是media.my-site.com.

Mat*_*hew 6

鉴于CloudFront目前不允许您直接限制访问(据我所知),我会做类似的事情:

<video src="/media.php?v=my-video.mp4"></video>
Run Code Online (Sandbox Code Playgroud)

然后你的media.php文件看起来像:

if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != 'my-site.com')
{
  header('HTTP/1.1 503 Hot Linking Not Permitted');
  // display some message / image / video
  exit;
}

# this base url changes from time to time
$url = 'http://cdn.my-site.com';

header("Location: $url/{$_GET['v']}");
Run Code Online (Sandbox Code Playgroud)

为了使它不那么明显,您可能需要设置重写以路由/media/my-video.mp4到文件中.这样,它看起来不像是一个中间PHP脚本.

究竟如何进行引荐来源检查取决于您想要的安全级别.有些人禁用推荐人,所以你可能想要允许空推荐人.或者您甚至可以检查是否存在会话变量或cookie等.

当然,最终用户将能够嗅出真实的URL.这就是您可能希望不时更改CNAME的原因.

希望这个解决方案足以阻止人们滥用您的网站,但绝不是完美的.