1

これは、phpスクリプトを使用してサーバーからファイルをダウンロードすることに関する質問です。ユーザーがダウンロード リンクをクリックすると、download.phpファイルに処理され、それを使用しheaderてダウンロードが開始されました。

ファイルをダウンロードした後、ファイルには 1 つの関数があり、ダウンロードしたファイルdownload.phpに関する mysql データベースを更新し、ユーザーのアカウントからお金を差し引きます。すべて正常に動作します。

現在、ユーザーが PC にダウンロード マネージャーをインストールしている場合に問題が発生します。ブラウザーとダウンロード マネージャーの両方でダウンロードが開始される場合があります。そのため、最後にデータベースに 2 つのダウンロード エントリがあり、ユーザーのアカウントから 2 回お金が差し引かれます。

質問: 一度に 1 つのダウンロードだけを開始する方法はありますか? または、このことを行う他の方法はありますか?

ユーザーに提供するダウンロード リンク。

<a href='download.php?id=1'>Download Test Video</a>

ファイルのダウンロードに使用しているスクリプト。(ダウンロード.php)

    $file = "c:/test.avi"; // $file = $_GET['id'];
    $title = "Test Video";

    header("Pragma: public");
    header('Content-disposition: attachment; filename='.$title);
    header("Content-type: ".mime_content_type($file));
    header("Content-Length: " . filesize($file) ."; ");
    header('Content-Transfer-Encoding: binary');
    ob_clean();
    flush();

    $chunksize = 1 * (1024 * 1024); // how many bytes per chunk
    if (filesize($file) > $chunksize) {
        $handle = fopen($file, 'rb');
        $buffer = '';

        while (!feof($handle)) {
            $buffer = fread($handle, $chunksize);
            echo $buffer;
            ob_flush();
            flush();
        }

        fclose($handle);
    } else {
        readfile($file);
    }

    record_download('user id', 'file id');
4

3 に答える 3

0

I would recommend to alter the logic:

But there is a security hole!

If two people start download that file with that link, then they can bypass payment for one. But what if someone download that file and send it to other. So, that isn't so much problem. isn't it?

But there is a option attach CSRF token if you think you should really safe.

于 2013-04-11T07:38:01.327 に答える