如何让我的PHP控制下载程序停止重复下载IP地址?

时间:2013-04-07 16:22:06

标签: php html

我有一个简单的下载页面,它接收文件URL,下载计数器.TXT文件URL,以及下载后的重定向链接。这都是通过PHP参数发送的。问题是,有人一直在向下载者发送垃圾邮件并弄乱了计数。我想在下载计数器上设置一个上限,这样每个可下载项目的每个地址只能计算3次点击。

我需要能够只使用PHP,没有MySQL数据库。我确实有这个理由,我的数据库服务器是垃圾和不可靠的,我不能让计数器失效。

这是我当前的下载程序PHP文件。更多信息,此PHP文件位于/counter的自己的文件夹中,每个下载计数TXT文件都有一个/counter/data目录。这些文件只存储一个整数值。

<?
    //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次?

非常感谢帮助。

修改 正如我上面所说,我不能使用数据库。此外,我对两个解决方案感兴趣,但不知道如何使它们工作(我正在寻找代码示例),一个是cookie,另一个是充当数据库的文本文件。

3 个答案:

答案 0 :(得分:2)

根本不使用任何数据库,这将非常困难。如果你根本不能使用MySQL,我会感到惊讶,但也许像SQLite这样简单的东西可能会起作用。除此之外,我可以想到两种解决方案:文件系统和cookie。

Cookie的问题在于它们是短暂的,如果你有机器人发送垃圾邮件,他们可能会拒绝cookie设置。

您可以做的是维护

文件
IP    download-count    last-download-time

如果文件足够小,您可以使用file将其加载到内存中,并使用preg_grep搜索IP地址并以此方式更新计数。

请注意,IP地址可能不是最好的选择,因为一些有效和无效的用户可能共享移动路由器,而IP地址可能会被使用代理等欺骗。您最好的选择是某种用户身份验证系统,但如果没有数据库,这将是非常困难的

答案 1 :(得分:1)

我会使用Memcache。 您可以在此处查看PHP的文档:http://php.net/manual/en/book.memcache.php

您可以使用IP地址字符串作为密钥,然后在每个下载请求中,您将尝试执行$ memcache-&gt; get($ key)。如果那不存在,你会做一个$ memcache-&gt; set($ key,$ downloadCount)。如果密钥确实存在,则会增加downloadCount。

答案 2 :(得分:0)

数据必须存储在某处,因为PHP总是“从头开始”。如何用文本文件来表示数据库?