2

ファイル URL、ダウンロード カウンター .TXT ファイル URL、およびダウンロード後のリダイレクト リンクを受け取る単純なダウンロード ページがあります。これはすべて、PHP 引数を介して送信されます。問題は、誰かがダウンローダにスパムを送信し、カウントを台無しにしていることです。ダウンロード カウンターに上限を設けて、ダウンロード可能なアイテムごとに各アドレスから 3 ヒットしかカウントしないようにします。

PHP のみで、MySQL データベースなしでこれを実行できるようにする必要があります。これには理由があります。私のデータベース サーバーはゴミで信頼性が低く、カウンターをダウンさせることはできません。

これは私の現在のダウンローダー PHP ファイルです。詳細については、この PHP ファイルは、 TXT ファイルをカウントする各ダウンロード/counterのディレクトリを含む独自のフォルダーにあります。/counter/dataこれらのファイルには、整数値が 1 つだけ格納されます。

<?
    //Retrieve downloadable file URL
    $c_url = urldecode($_GET['url']);

    //retrieve redirect page URL
    $c_page = urldecode($_GET['page']);

    //Retrieve download counter TXT URL
    $c_file = "../" . $_GET['file'];
?>

<!-- Set up simple styles -->
<head>
    <style type="text/css">
        body{
            background: url("../images/background.png");
            color: #ffffff;
        }
    </style>
</head>

<!-- Creates download file URL in hidden iFrame -->
<iframe src="<?echo $c_url;?>" id="hiddenFrm" style="display:none;" frameborder="0"></iframe>

<body>
<center>
    <h1>Your download is starting</h1><br>
    <p>You should be redirected momentarily...<br>

    <?
    <br><br>

    if (file_exists($c_file))
    {
        //Add one value to the counter file
        file_put_contents($c_file, ((int) file_get_contents($c_file)) + 1);

        //Set an automatic redirect for the page (Return home)
        ?>
        <meta http-equiv="refresh" content="0;url=<?echo $c_page;?>" />
        <?

        //Display information about the download, and alternate exits to the page
        if ($c_url != "") 
        {?>
            <b><a href="<?echo $c_url?>">Click here</a> if the download did not start.<br><br>
            <a href="<?echo $c_page?>">Click here</a> if this page does not close after your download.</b></p>
        <?} 
        else 
        {
        ?>
            <b><a href="<?echo $c_page?>">Click here</a> if you are not redirected automatically</b></p>
        <?
        }
    }
    else
    {
        //In case our counter file is improperly specified
        echo "<br><br><br>Error, the counter file was not found!";
    }
    ?>
    </center>
</body>

私の質問は簡単です: 各製品をダウンロードした人の IP アドレスを保存し、PHP のみを使用してデータベースを使用せずに、ダウンロード カウンターがそのアドレスから 3 つ以上のダウンロードをカウントしないようにするにはどうすればよいですか?

助けていただければ幸いです。

編集: 上で述べたように、データベースを使用できません。また、2 つのソリューションに興味がありますが、それらを機能させる方法がわかりません (コード例を探しています)。1 つは Cookie で、もう 1 つはデータベースとして機能するテキスト ファイルです。

4

3 に答える 3

2

データベースをまったく使用しないと、かなり大変です。MySQL をまったく使用できない場合は驚かれることでしょうが、SQLite のようなさらに単純なものが機能する可能性があります。それ以外に、ファイル システムと Cookie という 2 つの解決策が考えられます。

Cookie の問題は、それらが一時的なものであることです。ボットがスパムを送信している場合、いずれにしても Cookie の設定を拒否する可能性があります。

あなたができることは、のファイルを維持することです

IP    download-count    last-download-time

ファイルが十分に小さい場合は、メモリにロードしfileて IP アドレスを検索し、preg_grepそのようにカウントを更新できます。

一部の有効なユーザーと無効なユーザーがモバイルルーターを共有している可能性があり、プロキシなどを使用して IP アドレスがスプーフィングされる可能性があるため、IP アドレスが最善の策ではない可能性があることに注意してください。最善の策は、ある種のユーザー認証システムですが、 DBがないと非常に難しい

于 2013-04-07T16:31:38.860 に答える
1

Memcache を使用します。ここで PHP のドキュメントを参照できます: http://php.net/manual/en/book.memcache.php

IP アドレスの文字列をキーとして使用できます。ダウンロード要求ごとに、$memcache->get($key) を実行しようとします。それが存在しない場合は、$memcache->set($key, $downloadCount) を実行します。キーが存在する場合は、downloadCount をインクリメントします。

于 2013-04-07T16:45:09.127 に答える
0

PHP は常に「ゼロから始める」ため、データはどこかに保存する必要があります。データベースを表すテキスト ファイルはどうでしょうか。

于 2013-04-07T16:28:43.973 に答える