Расширенный PHP: разрешить нажатие на уникальный URL только по первым трем IP-адресам - PullRequest
0 голосов
/ 04 августа 2011

Продаю услугу просмотра подписки. После того, как люди заплатили, они получают уникальный URL по электронной почте. Срок действия ссылки истекает через определенное время, но я бы хотел, чтобы только первые три IP-адреса использовали ссылку до истечения срока действия, чтобы остановить пиратство. Я делаю это так, чтобы избежать запуска еще одной базы данных, содержащей тысячи логинов. Я предполагаю, что могу записать в каталог и иметь имя файла в качестве суффикса ссылки (zFZpj4b2AkEFz%2B3O в этом случае) с указанием до трех IP-адресов в файле.

Пока все работает хорошо, за исключением подсчета IP-адресов и уникальной ссылки, по которой электронная почта выглядит так:

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-файла на стороне сервера при первом нажатии ссылки и запрета доступа, если он существует?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Для этого необходимо создать таблицу для каждой подписки.

table subscription: subId, subCode, subVisitTimes, subVisitedIP

subCode будет что-то вроде zFZpj4b2AkEFz%2B3O

за каждое посещение вы получаете IP клиента, используя $_SERVER['REMOTE_ADDR'].

  1. Если он существует в subVisitedIP, разрешить доступ.
  2. Если его не существует, проверьте значение subVisitTimes:

    • если subVisitTimes = 3, то запретить доступ
    • Если subVisitTimes < 3, то разрешить доступ и увеличить его значение на единицу, добавить IP-адрес клиента к subVisitedIP (вы должны использовать функцию сериализации для хранения массива из трех IP-адресов).
1 голос
/ 04 августа 2011

Вы захотите создать для этого простую базу данных.Вам нужна только одна строка - хэш / идентификатор, исходный IP-адрес, срок действия истек и т. Д., И можно просто установить значение expired на 1, когда доступ закончитсяТаким образом, вы не выполняете дорогостоящие запросы DELETE, и при необходимости вы можете просто удалять эти строки все раз в пару раз в месяц для экономии места.склонны к использованию плоских файлов.

...