Создайте ip-адрес и ограниченную по времени ссылку для загрузки


Существует прямая ссылка для загрузки файла. пользователи могут загрузить эту ссылку после выплаты, например:

http://example.com/download/webapp.rar

Но мне нужно сгенерировать ip-адрес и ограниченную по времени ссылку для загрузки, чтобы предотвратить передачу файла другим пользователям. Я хочу сделать это без использования каких-либо баз данных. что-то вроде этого:

http://example.com/download.php?a5fds588fgdf

Или

http://example.com/download/a5fds588fgdf

Есть ли какие-нибудь советы?

Author: Tshepang, 2011-10-27

3 answers

Для этого есть действительно хороший модуль nginx.

URL-адрес получает два параметра - назовем их s (безопасность) и t (метка времени). Безопасность - это безопасный хэш, сгенерированный из метки времени, пути и соли (в вашем случае просто добавьте 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

Также есть подвеска для лайти: http://redmine .lighttpd.net/wiki/1/Docs:ModSecDownload

Или модуль безопасной загрузки nginx: http://wiki.nginx.org/HttpSecureDownload

Может быть, есть что-то и для apache... Может быть, вы могли бы что-то сделать с переписыванием там...

 26
Author: Hikaru-Shindo, 2011-10-27 16:14:31

Если вас не беспокоит, что люди могут декодировать некоторые параметры, такие как IP или метка времени, вы можете попробовать что-то вроде этого:

<?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; сделал бы трюк в одной строке...Хотя не так весело.

 4
Author: Tom, 2011-10-27 15:19:50

Мой главный совет - используйте базу данных!

Но если вам абсолютно необходимо сделать это без этого, я бы предложил использовать библиотеку кэширования, такую как cache-lite: http://pear.php.net/manual/en/package.caching.cache-lite.intro.php

Многие фреймворки PHP (если вы используете один из них) также поставляются с библиотекой кэширования

Вы можете кэшировать IP-адрес и случайный ключ, который вы назначаете, вместе с датой истечения срока действия (некоторые библиотеки кэша также позволяют назначать кэш срок действия)

 0
Author: Nick Long, 2011-10-27 15:11:30