Итак, у нас есть следующие требования на данный момент
- Разрешить пользователю скачивать только в его/ее сеансе
- не копировать и не вставлять ссылку кому-то другому
- Пользователи должны загрузить с сайта, например. нет хотлинкинга
- Контроль скорости
Посмотрим. Это не рабочий код, но он должен работать следующим образом:
<?php // download.php
session_start(); // start or resume a session
// always sanitize user input
$fileId = filter_input(INPUT_GET, 'fileId', FILTER_SANITIZE_NUMBER_INT);
$token = filter_input(INPUT_GET, 'token', FILTER_UNSAFE_RAW);
$referer = filter_input(INPUT_SERVER, 'HTTP_REFERER', FILTER_SANITIZE_URL);
$script = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL);
// mush session_id and fileId into an access token
$secret = 'i can haz salt?';
$expectedToken = md5($secret . session_id() . $fileId);
// check if request came from download.php and has the valid access token
if(($expectedToken === $token) && ($referer === $script)) {
$file = realpath('path/to/files/' . $fileId . '.zip');
if(is_readable($file)) {
session_destroy(); // optional
header(/* stuff */);
fpassthru($file);
exit;
}
}
// if no file was sent, send the page with the download link.
?>
<html ...
<?php printf('a href="/download.php?fileId=%s&token=%s',
$fileId, $expectedToken); ?>
...
</html>
И это все. База данных не требуется. Это должно охватывать требования 1-3. Вы не можете контролировать скорость с помощью PHP, но если вы не уничтожите сеанс после отправки файла, вы можете написать счетчик сеанса и ограничить количество файлов, которые пользователь будет отправлять во время сеанса.
Я полностью согласен с тем, что это можно было бы решить гораздо более элегантно, чем с помощью этого хака в форме обезьяны, но в качестве доказательства концепции этого должно быть достаточно.
person
Gordon
schedule
22.11.2009