5

PayPal経由で私からコンテンツを購入する顧客を許可することに問題があると予測しています。複数の無形の商品を提供します。誰かがこれらの商品の購入を完了すると、ランディングページ(「thank_you.php」と呼びましょう)にリダイレクトされます。これにより、ダウンロードが自動的にキューに入れられ、そうでない場合はリンクがダウンロードをキューに入れることができます。自動的に起動します。これは、一意のアイテムIDをダウンロードページ( "download.php")に渡すことによって行われます。

この方法は、基本的にこれらのスレッドからの上位の回答を模倣しています。

PHPはダウンロード用のファイルを生成し、リダイレクトします

ユーザーが私のウェブサイトの実際のファイルリンクを明らかにすることなく、私のウェブサイトからファイルをダウンロードできるようにするPHPスクリプト?

ただし、ユーザーが「thank_you.php」にアクセスすると、アイテムをダウンロードしてから、Firebug(または同等のもの)を使用してアイテムIDを編集し、別の別のアイテムをダウンロードできるようになるのではないかと心配しています。

<a href="download.php/38a205ec300a3874c867b9db25f47c61">Download Here</a>

<a href="download.php/7c8ddc86c0e4c14517b9439c599f9957">Download Here</a>

私よりもはるかに優れている皆さんからのアイデアと助けが必要です。同じ顧客のアクセスと余暇を許可し、それでもこの操作を防ぐソリューションとして、何を(そしてどのように)実装できますか?

編集:IDハッシュは、サイト全体でアイテムをプレビューおよび参照するために使用されます。人々が推測する心配はありませんが、別のタブでサイトを閲覧して他のIDを取得し、別のアイテムをダウンロードし続けます。

4

5 に答える 5

4

私の最初の答え:

ユーザーがアクセスできるアイテムを(データベースまたはセッション変数に)格納する必要があります。各アイテムに対して、一意のランダムトークンを生成します。そのトークンは、購入したアイテムを識別するために使用されます。ダウンロードできるページにトークンを渡します(セッション変数、POST引数、またはURLの最後のオプションとしてGET)。ダウンロードする必要があるページでは、セッション情報を使用してデータベース/セッション変数を照会し、顧客と渡されたトークン(ただし、渡したトークン)を識別し、それを使用してダウンロードするファイルを取得します。

再ダウンロードのために購入したアイテムのリストを保持する必要がある場合は、それも可能ですが、ユーザーがダウンロードを要求したときにトークンを再度作成することを忘れないでください。必要に応じて、有効期限を追加することもできます。


ここで、いくつかの選択肢について説明しましたが、引用された回答の性質から、その方法についてさらに詳しく説明する必要があると思います。

アーニーが正しいかもしれません、そして私はあなたがセッションを持っていると仮定するべきではありません。セッションのやり方をお見せしたほうがいいかもしれません。

そこで、実装のオプションの1つである、最も単純なオプションを取り上げます。


<?php
    //Oh, I'm in a PHP page...
    //check if there is not a session
    if (session_id() != '')
    {
        //Ok, there is no session, let's create one
        session_start();
    }
    //Now we are sure there is a session
    //Let's store in the session the id of the file I want to allow to download
    $_SESSION['download'] = GetFileId();
    //GetFileId will do some mambo jambo expecto patronum to return an id
    //The id will be 38a205ec300a3874c867b9db25f47c61 or something
?>

今ダウンロードページで....

<?php
    //Oh, I'm in another PHP page...
    //check if there is not a session
    if (session_id() != '')
    {
        //no session? screw you, no download for you
        header('Location: sorry.php');
    }
    else
    {
        //Now we are sure there is a session
        //Let's get from the session the id of the file I want to allow to download
        $id = $_SESSION['download'];
        //Now get the url to redirect to allow the download
        $url = GetUrl($id);
        //GetUrl will do some mambo jambo expecto patronum to return an url
        //Ok, now we are going to return that file...
        //So put the correct MIME type
        header('content-type: image/gif');  //if it is a gif...
        //Load the file
        $contents = file_get_contents($url); 
        echo $contents;
        //That's the only output
        exit();
     }
?>

PHPからのみファイルへのアクセスを許可していることに注意してください。これにより、ユーザーがアクセス権を持っているかどうかを最初に確認できます。ユーザーがURLを入力して(推測できない場合でも)ファイルにアクセスすることを許可しないでください。したがって、サーバーを実行している場合は、それらのファイルをサーバーのWebフォルダーの外に配置するか、ホスティングを使用している場合は、.htaccess(またはホスティングが提供する別のメカニズム)でファイルを保護します。


このソリューションについてのコメント:

シンプルで実装も簡単です。しかし、いくつかの欠点があります。

  • ダウンロード前にセッションが終了した場合、ユーザーはお金を失いました*。
  • 再ダウンロードを実装する明確な方法はありません。
  • それはまだセッションハイジャックに対して脆弱です(私は知っていますが、はるかにフェッチされますが、より安全です)。

*:接続が失われ、クライアントでセッションが期限切れになったとします。ああ、いや、私たちは幸せな顧客を必要としない。

したがって、実際には、これをデータベースでバックアップし、できれば有効期限付きのランダムトークンを作成する必要があります。

于 2012-10-04T00:22:26.483 に答える
4

これらの他の回答は、ユーザー名を使用したセッションがあることを前提としていますが、ファイル名を非表示にするためにファイルへのハッシュを作成したかのように聞こえます。言い換えれば、キーボードにサルのハンマーを置いて、それを各ファイルのファイル名にすることもできます。

その場合、ユーザーがやって来てキーボードを叩き、どういうわけかあなたのサルがしたことと完全に一致することになるのではないかと心配しているように聞こえます。これはありそうにありません。

より可能性が高いのは、誰かがあなたのリンクをコピーして貼り付け、それを共有することです。認証スキームに少なくとももう1つのレイヤーを追加する必要があるように聞こえます(たとえば、ユーザー名とアイテムIDの両方のハッシュオフ)、または使用後にリンクを期限切れにする必要があります。

コメントからは、ハッシュを使用してWebサイトの別の部分にあるアイテムを識別しているようにも聞こえます。つまり、ユーザーはWebサイトの別の部分にあるソースを調べることでアイテムのハッシュを判別できます。この時点で、隠すことによるセキュリティは、誰かとうわさ話をしたり、「魚と猫が作った」と言ったりしながら、コードワードを使用するのとよく似ています(たとえば、「魚はジョンを意味し、猫はリサを意味します」)。誰でも見ることができるようにマッピングが書き留められた側の紙。ファイル名を非表示にして、他の人が推測できないようにしているようです。これは、隠すことによるセキュリティとして知られており、実際にはあまり購入しません。

他のほとんどの回答は、アイテムが存在し、そのアイテムを指す複数の異なるハッシュがあることを前提としています(たとえば、file1には、hash1、hash2、hash3がすべて有効なリンクになります)。この場合、複数のハッシュを作成し、各ハッシュは特定のユーザー+アイテムに固有です。彼らはまた、あなたがダウンロードアイテムを参照しないウェブサイト上のすべての人を想定していると思いますがitem1hash1それはあなたがしているように聞こえますか?

コード内のどこかに、アイテムの名前とハッシュの間にマッピングがある辞書を作成し、ダウンロードページでのみ、名前の代わりにハッシュを使用する方がよい場合があります。繰り返しになりますが、これは隠すことによるセキュリティにすぎず、リンクを共有することはできますが、サイトを閲覧しているだけではハッシュを取得できません。

于 2012-10-04T00:27:30.933 に答える
3

彼らが支払いをするとき、彼らが利用できるダウンロードのIDとランダムハッシュを両方とも支払いテーブルに保存します。そのハッシュを使用してIDを取得します。その場合、ハッシュは特定の製品に関連するのではなく、支払いに関連する必要があります。

于 2012-10-04T00:17:26.250 に答える
1

実装できる最も簡単なものの1つは、ユーザーの購入を追跡するためのロギングシステムです。要求されたIDを、ユーザーの購入に関連して保存されたIDと相互参照できます。それらが関連していない場合は、ファイルを提供しないでください。

于 2012-10-04T00:18:03.077 に答える
1

ユーザーがデータベースで購入したアイテムを追跡する必要があります。download.phpは、ユーザーがダウンロードしようとしているアイテムを購入したかどうかを確認できます。

于 2012-10-04T00:19:36.030 に答える