Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高级PHP:只允许前三个IP单击唯一的URL_Php_Ip - Fatal编程技术网

高级PHP:只允许前三个IP单击唯一的URL

高级PHP:只允许前三个IP单击唯一的URL,php,ip,Php,Ip,我正在出售订阅查看服务。一旦人们付费,他们就会收到一个独特的URL电子邮件。该链接设置为在一定时间后过期,但我只允许前三个IP地址在过期之前使用该链接以阻止盗版。我这样做是为了避免另一个数据库运行时包含数千个登录名。我假设我可以写入一个目录,并将一个文件名作为链接的后缀(zFZpj4b2AkEFz%2B3O,本例中为),文件中最多列出三个IP 目前为止,除了IP地址计数和电子邮件的唯一链接外,一切都运行良好: <? $time = time(); include('settings.php

我正在出售订阅查看服务。一旦人们付费,他们就会收到一个独特的URL电子邮件。该链接设置为在一定时间后过期,但我只允许前三个IP地址在过期之前使用该链接以阻止盗版。我这样做是为了避免另一个数据库运行时包含数千个登录名。我假设我可以写入一个目录,并将一个文件名作为链接的后缀(
zFZpj4b2AkEFz%2B3O,本例中为
),文件中最多列出三个IP

目前为止,除了IP地址计数和电子邮件的唯一链接外,一切都运行良好:

<?
$time = time();
include('settings.php');
class RC4Crypt {

        /**
         * Encrypt the data.
         * @param string private key.
         * @param string data to be encrypted.
         * @return string encrypted string.
         */
        function encrypt ($pwd, $data)
        {
                $key[] = '';
                $box[] = '';

                $pwd_length = strlen($pwd);
                $data_length = strlen($data);

                for ($i = 0; $i < 256; $i++)
                {
                        $key[$i] = ord($pwd[$i % $pwd_length]);
                        $box[$i] = $i;
                }

                for ($j = $i = 0; $i < 256; $i++)
                {
                        $j = ($j + $box[$i] + $key[$i]) % 256;
                        $tmp = $box[$i];
                        $box[$i] = $box[$j];
                        $box[$j] = $tmp;
                }

                $cipher = '';

                for ($a = $j = $i = 0; $i < $data_length; $i++)
                {
                        $a = ($a + 1) % 256;
                        $j = ($j + $box[$a]) % 256;

                        $tmp = $box[$a];
                        $box[$a] = $box[$j];
                        $box[$j] = $tmp;

                        $k = $box[(($box[$a] + $box[$j]) % 256)];
                        $cipher .= chr(ord($data[$i]) ^ $k);
                }
                return ($cipher);
        }
        /**
         * Decrypt the data.
         * @param string private key.
         * @param string cipher text (encrypted text).
         * @return string plain text.
         */
        function decrypt ($pwd, $data)
        {               
                return RC4Crypt::encrypt($pwd, ($data));
        }
}

if(!isset($_GET['file']) || empty($_GET['file'])) {
        echo 'Invalid Request';
        return;
}

$data = $_GET['file'];

$id_time = RC4Crypt::decrypt($secret,base64_decode(rawurldecode($data)));

list($product_id,$timestamp) = explode('|',$id_time);

if(!isset($products[$product_id])) {
        echo 'Invalid Request';
        return;
}

if ($timestamp < $time - ($download_life * 60 )) {
        echo 'Link Expired';
        return;
}

if(isset($products[$product_id])) {
print ("<html><head><meta http-equiv=Refresh content=\"0;URL=http://www.blah.com/view/\"></head><body></html>");
        return;
}
?>
http://www.blah.com/download.php?file=zFZpj4b2AkEFz%2B3O

文件download.php如下所示:

<?
$time = time();
include('settings.php');
class RC4Crypt {

        /**
         * Encrypt the data.
         * @param string private key.
         * @param string data to be encrypted.
         * @return string encrypted string.
         */
        function encrypt ($pwd, $data)
        {
                $key[] = '';
                $box[] = '';

                $pwd_length = strlen($pwd);
                $data_length = strlen($data);

                for ($i = 0; $i < 256; $i++)
                {
                        $key[$i] = ord($pwd[$i % $pwd_length]);
                        $box[$i] = $i;
                }

                for ($j = $i = 0; $i < 256; $i++)
                {
                        $j = ($j + $box[$i] + $key[$i]) % 256;
                        $tmp = $box[$i];
                        $box[$i] = $box[$j];
                        $box[$j] = $tmp;
                }

                $cipher = '';

                for ($a = $j = $i = 0; $i < $data_length; $i++)
                {
                        $a = ($a + 1) % 256;
                        $j = ($j + $box[$a]) % 256;

                        $tmp = $box[$a];
                        $box[$a] = $box[$j];
                        $box[$j] = $tmp;

                        $k = $box[(($box[$a] + $box[$j]) % 256)];
                        $cipher .= chr(ord($data[$i]) ^ $k);
                }
                return ($cipher);
        }
        /**
         * Decrypt the data.
         * @param string private key.
         * @param string cipher text (encrypted text).
         * @return string plain text.
         */
        function decrypt ($pwd, $data)
        {               
                return RC4Crypt::encrypt($pwd, ($data));
        }
}

if(!isset($_GET['file']) || empty($_GET['file'])) {
        echo 'Invalid Request';
        return;
}

$data = $_GET['file'];

$id_time = RC4Crypt::decrypt($secret,base64_decode(rawurldecode($data)));

list($product_id,$timestamp) = explode('|',$id_time);

if(!isset($products[$product_id])) {
        echo 'Invalid Request';
        return;
}

if ($timestamp < $time - ($download_life * 60 )) {
        echo 'Link Expired';
        return;
}

if(isset($products[$product_id])) {
print ("<html><head><meta http-equiv=Refresh content=\"0;URL=http://www.blah.com/view/\"></head><body></html>");
        return;
}
?>

任何善良的灵魂都能同情一个已经花了太长时间看这个的人吗非常感谢

--编辑--


一个想法:忘记3个IP当第一次按下链接时存储服务器端cookie并拒绝访问(如果存在)怎么样?

您需要为此设置一个简单的数据库。您只需要一行—哈希/id、原始IP、expired等,并且可以在访问权限用完时将expired设置为1。这样,您就不会运行代价高昂的删除查询,如果需要的话,您可以一个月一次性删除几次这些行以节省空间


否则,使用flatfiles会变得太复杂,更容易出错。

您需要为此设置一个简单的数据库。您只需要一行—哈希/id、原始IP、expired等,并且可以在访问权限用完时将expired设置为1。这样,您就不会运行代价高昂的删除查询,如果需要的话,您可以一个月一次性删除几次这些行以节省空间


否则,使用flatfiles会变得太复杂,更容易出错。

要做到这一点,您必须为每个订阅创建一个表

表订阅:子ID、子代码、子访问时间、子访问IP

子代码
类似于
zfzppj4b2akefz%2B3O

对于每次访问,您都可以使用
$\u服务器['REMOTE\u ADDR']
获取客户端的IP

  • 如果它确实存在于
    子访问IP
    中,则允许访问
  • 如果不存在,则检查子访问时间
  • 值:

    • 如果
      subVisitTimes=3
      ,则拒绝访问
    • 如果
      subVisitTimes<3
      ,则允许访问并将其值增加一,同时将客户端的IP添加到
      subVisitedIP
      (应使用序列化函数存储三个IP的数组)

    为此,必须为每个订阅创建一个表

    表订阅:子ID、子代码、子访问时间、子访问IP

    子代码
    类似于
    zfzppj4b2akefz%2B3O

    对于每次访问,您都可以使用
    $\u服务器['REMOTE\u ADDR']
    获取客户端的IP

  • 如果它确实存在于
    子访问IP
    中,则允许访问
  • 如果不存在,则检查子访问时间
  • 值:

    • 如果
      subVisitTimes=3
      ,则拒绝访问
    • 如果
      subVisitTimes<3
      ,则允许访问并将其值增加一,同时将客户端的IP添加到
      subVisitedIP
      (应使用序列化函数存储三个IP的数组)

    谢谢你的两个答案。我想我可能不得不放弃我所做的。我真的很想避免DB。您知道有哪些付费PHP脚本会限制对生成链接的点击次数吗?再次感谢。一个想法:忘记3个IP,在第一次按下链接时存储服务器端cookie并拒绝访问(如果存在)怎么样?不是我想的,但是,我愿意为你写一个。如果你真的决定不使用数据库,那么处理平面文件/等可能会有点麻烦,但这是可以做到的。谢谢你的两个答案。我想我可能不得不放弃我所做的。我真的很想避免DB。您知道有哪些付费PHP脚本会限制对生成链接的点击次数吗?再次感谢。一个想法:忘记3个IP,在第一次按下链接时存储服务器端cookie并拒绝访问(如果存在)怎么样?不是我想的,但是,我愿意为你写一个。如果你真的决定不使用数据库,那么处理平面文件等可能会有点麻烦,但这是可以做到的。你需要一些人工验证,搜索引擎工具栏和病毒程序之类的东西会自动跟随链接,可能会不必要地被视为印象。谢谢,但这是一封唯一的过期电子邮件。你需要一些人工验证,像搜索引擎工具栏和病毒程序这样的东西会自动跟随链接,可能会不必要地被认为是一种印象。谢谢,但这是一封只有有效期的独特电子邮件。