13

我想允许任何人在我的网站上播放位于我的 s3 中的视频作为src标签<video>,但不允许人们src在他们的网站上使用它通过在浏览器栏中输入 url 直接播放视频。

希望人们这样做:

在此处输入图像描述

不希望以下 HTML 出现在 http://your-site.com 上,而只出现在http://my-site.com上:

<html>
    <video src="https://s3.amazonaws.com/my-bucket/my-video.mp4"></video>
</html>

我已经看到了一些关于此的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/*"
                ]
            }
        }
    }
  }

两个问题:

  1. 为了测试我的存储桶策略,我将上面的 HTML 放在本地主机上的测试文件中,果然我可以通过键入来访问视频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。

4

2 回答 2

6

鉴于 CloudFront 目前不允许您直接限制访问(据我所知),我会执行以下操作:

<video src="/media.php?v=my-video.mp4"></video>

然后你的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']}");

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

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

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

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

于 2012-07-17T17:41:03.330 回答
4

除了直接链接到您的 S3 文件之外,您是否可以使用 PHP 作为代理,以便最终用户永远看不到实际的 S3 URL,并且您可以更轻松地验证引用者?不过,您可能需要某种数据库,因此您可以将 ID 链接到 S3 文件。例如(不考虑安全措施):

<?php
$file = $_GET['id'];
$referer = $_SERVER['HTTP_REFERER'];

if($referer === 'http://my-site.com/test.html'){
    $s3 = //Query your database of S3 files with the ID provided to get the S3 URL
    header(mime_content_type($s3));
    include($s3);
}
?>

这可以保存为 get_file.php 或任何你想要的,你可以把链接http://my-site.com/file/get_file.php?id=120381放在你的 HTML 中。

更进一步,您可以使用 .htaccess 文件将请求路由http://my-site.com/file/120381.mp4http://my-site.com/file/get_file.php?id=120381.

我不确定这会如何运作,我提供的 PHP 代码只是帮助传达我的想法的一个示例;它不是完美的代码,所以请不要仅仅为此而对我投反对票。

于 2012-07-17T15:35:18.890 回答