13

自分のサイトのs3にある動画をタグで再生できるようにしたいのですが、サイトでのsrc使用<video>や、ブラウザバーにURLを入力して直接動画を再生することはできません。src

私は人々にこれをしてほしくない

ここに画像の説明を入力してください

次の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/*"
                ]
            }
        }
    }
  }

2つの質問:

  1. バケットポリシーをテストするために、上記のHTMLをローカルホストのテストファイルに入れ、。と入力してビデオにアクセスできることを確認しますhttp://localhost/test.html。バケットポリシーがこれを妨げないのはなぜですか?(私はそれがからのみ機能することを望みますhttp://my-site.com/test.html
  2. 人々がブラウザバーにs3URLを入力するのを防ぐために、ブラウザを介した直接アクセスを防ぐ方法がAWSのドキュメントから明らかでないため、バケットポリシーとは別のソリューションが必要だと考えていました。推測しにくいようにURLをハッシュ化することを考えていました。おそらく、AWSバケットポリシーまたは他のソリューションを使用する方法はありますか?

より明確にするために、私のファイルはs3に保存されていますが、AmazonのCloudFrontによって配信されます。したがって、私のCloudFronturlsrcは現在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);
}
?>

http://my-site.com/file/get_file.php?id=120381これはget_file.phpまたは任意の名前で保存でき、代わりにHTMLのようにリンクを配置できます。

さらに一歩進むには、.htaccessファイルを使用してのようなリクエストをルーティングできhttp://my-site.com/file/120381.mp4ますhttp://my-site.com/file/get_file.php?id=120381

これがどれだけうまくいくかはわかりません。私が提供したPHPコードは、私の考えを伝えるのに役立つ単なる例でした。完璧なコードではないので、それだけに反対票を投じないでください。

于 2012-07-17T15:35:18.890 に答える