есть прямая ссылка для скачивания файла. пользователи могут скачать эту ссылку после выплаты, например:
http://example.com/download/webapp.rar
Но мне нужно создать ссылку на ip и время, ограниченную загрузкой, чтобы предотвратить пик файла с другими. Я хочу сделать это без использования каких-либо баз данных. что-то вроде этого :
http://example.com/download.php?a5fds588fgdf
или
http://example.com/download/a5fds588fgdf
есть ли советы?
Это действительно хороший модуль nginx.
URL-адрес получает два параметра – назовем их s (security) и t (timestamp). Безопасность – это безопасный хэш, генерируемый из метки времени, пути и соли (в вашем случае просто добавьте ip).
$ip = $_SERVER['REMOTE_ADDR']; $salt = 'change me cause im not secure'; $path = '/download/webapp.rar'; $timestamp = time() + 3600; // one hour valid $hash = md5($salt . $ip . $timestamp . $path); // order isn't important at all... just do the same when verifying $url = "http://mysite.com{$path}?s={$hash}&t={$timestamp}"; // use this as DL url
Проверять:
$ip = $_SERVER['REMOTE_ADDR']; $salt = 'change me cause im not secure'; $path = $_SERVER['REQUEST_URI']; $hashGiven = $_GET['s']; $timestamp = $_GET['t']; $hash = md5($salt . $ip . $timestamp . $path); if($hashGiven == $hash && $timestamp <= time()) { // serve file } else { die('link expired or invalid'); }
Теперь вам просто нужно переписать закачки на этот «человек в середине», и вы закончили.
Пример перезаписи для nginx:
location /download { rewrite ^.*$ /download.php last; break; }
Я не очень знакомы с перезаписью apache, поэтому вы можете проверить это самостоятельно.
Если вы используете один из следующих модулей, вам не нужно проверять все это самостоятельно, и это намного лучше, но обратите внимание, что он дает больше конфигурации, а иногда и другой способ генерации URL-адреса и хэша (см. Здесь документы модуля).
Или вы просто используете защищенный модуль связи nginx: http://wiki.nginx.org/HttpSecureLinkModule
Существует также подвеска для lighty: http://redmine.lighttpd.net/wiki/1/Docs:ModSecDownload
Или безопасный модуль загрузки nginx: http://wiki.nginx.org/HttpSecureDownload
Возможно, что-то для апачей тоже … Может быть, вы могли бы что-то сделать с переписаниями …
Если вас не беспокоят люди, способные декодировать некоторые параметры, такие как IP или timestamp, вы можете попробовать что-то вроде этого:
<?php $salt = 'SALTING'; // Hash cipher $key = new stdClass(); $key->limit = time()+3600; // 1 hour limit $key->ip = $_SERVER['REMOTE_ADDR']; $key->security = sha1(sha1($salt.serialize($key))); // Double sha1 for fun $key_param = base64_encode(serialize($key)); echo sprintf('http://mysite.com/download/%s', $key_param); ?>
Теперь для получения уникального ключа, действительного 1 часа, для ip $ key-> ip.
Чтобы проверить это:
<?php $salt = 'SALTING'; $key = $_GET['key']; $key = base64_decode($key); $key = unserialize($key); if($key->security != sha1(sha1($salt.serialize($key)) || $_SERVER['REMOTE_ADDR'] != $key->ip) { throw new Exception('Security breach. U mad bro ?'); } ?>
И все готово 🙂 Нет базы данных. После этого хешируются только хэши.
Но я думаю, что простая $_SESSION[$file_id] = time()+3600;
будет делать трюк в одной строке … Не так весело.
Мой главный совет будет использовать базу данных!
Но если вам абсолютно необходимо сделать это без этого, я бы предложил использовать библиотеку кеширования, такую как cache-lite: http://pear.php.net/manual/en/package.caching.cache-lite.intro.php
Многие фреймворки PHP (если вы их используете) также поставляются с библиотекой кэширования
Вы можете кэшировать IP-адрес и случайный ключ, который вы назначаете вместе с датой истечения срока действия (некоторые библиотеки кэшей также позволят вам назначить время проверки кеша)