Создайте временный файл и автоматически удалите

Я пишу анти-leeching download script, и мой план заключается в создании временного файла, который именован идентификатором сеанса, а затем по истечении срока действия сеанса файл будет автоматически удален. Является ли это возможным? И можете ли вы дать мне несколько советов, как это сделать в PHP?

Большое спасибо за любой ответ

Ответ 1

Итак, у нас есть один или несколько файлов, доступных для загрузки. Создание временного файла для каждого запроса на загрузку - не очень хорошая идея. Создание symlink() для каждого файла вместо этого - гораздо лучшая идея. Это позволит сэкономить массу дискового пространства и снизить нагрузку на сервер.

Именование символической ссылки после сеанса пользователя - достойная идея. Лучше всего создать случайное имя символьной ссылки и связать ее с сеансом, поэтому script может обрабатывать несколько загрузок за сеанс. Вы можете использовать session_set_save_handler() (ссылка) и зарегистрировать пользовательскую функцию read, которая проверяет истекшие сеансы и удаляет символические ссылки, когда истекло время сессии.

Ответ 2

PHP имеет функцию для этого имени tmpfile. Он создает временный файл и возвращает ресурс. Ресурс может использоваться как любой другой ресурс.

например. пример из руководства:

<?php
$temp = tmpfile();
fwrite($temp, "writing to tempfile");
fseek($temp, 0);
echo fread($temp, 1024);
fclose($temp); // this removes the file
?>

Файл автоматически удаляется при закрытии (с использованием fclose()) или при завершении script. Вы можете использовать любые функции файла на ресурсе. Вы можете найти здесь здесь. Надеюсь, это вам поможет?

Другим решением было бы создать файл обычным способом и использовать cronjob для регулярной проверки, если срок действия сеанса истек. Дата истечения срока действия и другие данные сеанса могут храниться в базе данных. Используйте script для запроса этих данных и определения того, истек ли сеанс. Если это так, удалите его физически с диска. Обязательно запустите script один раз в час или около того (в зависимости от вашего таймаута).

Ответ 3

Не могли бы вы объяснить свою проблему немного глубже? Потому что я не вижу причины, почему бы не использовать $_SESSION. Данные в $_SESSION хранятся на стороне сервера в файле (см. http://php.net/session.save-path) BTW. По крайней мере, по умолчанию.; -)

Ответ 4

Я бы посоветовал вам не копировать файл в первую очередь. Я бы сделал следующее: когда пользователь запрашивает файл, вы создаете случайную уникальную строку, чтобы дать ему ссылку следующим образом: dl.php?k=hd8DcjCjdCkk123 затем поместите эту строку в базу данных, сохранив свой IP-адрес, возможно, сеанс и время, ve создал ссылку. Затем другой пользователь запрашивает этот файл, убедитесь, что все вещи (хеш, ip и т.д.) Совпадают, и ссылка не истекла (например, не больше, чем N часов прошло с момента генерации), и если все в порядке, используйте PHP для соединения файл. Задайте задание cron для просмотра базы данных и удаления устаревших записей. Как вы думаете?

tmpfile

Создает временный файл с уникальным имя в режиме чтения-записи (w +) и возвращает дескриптор файла. Файл автоматически удаляется при закрытии (используя fclose()), или когда scriptзаканчивается.Забастовкa >

Ответ 5

Итак, у нас есть следующие требования:

  • Разрешить загрузке пользователя только на его/ее сеансе
  • не копировать и вставлять ссылку на кого-то еще
  • Пользователи должны загружаться с сайта, например. нет hotlinking
  • Скорость управления

Посмотрим. Это не работает код, но он должен работать в следующих строках:

<?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&amp;token=%s', 
              $fileId, $expectedToken); ?>

...
</html>

И что это. Никакой базы данных не требуется. Это должно охватывать требования 1-3. Вы не можете контролировать скорость с помощью PHP, но если вы не уничтожаете сеанс после отправки файла, вы можете написать счетчик сессии и ограничить количество файлов, которые пользователь будет отправлен во время сеанса.

Я с полным основанием согласен, что это можно было бы решить гораздо шире, чем с этим взломом в виде обезьяны, но в качестве доказательства концепции это должно быть достаточно.

Ответ 6

Возможно, это поздно для ответа, но я пытаюсь использовать функцию googlize!

если вы используете CPanel, существует короткий и быстрый способ блокировки внешних запрос на ваши размещенные файлы, имя которых: HotLink.

вы можете включить HotLinks на Cpanel и убедиться, что никто не может запросить ваш файл с другого хостинга или использовать ваши файлы в качестве ссылки для скачивания.

Ответ 7

Чтобы добиться этого, я сделал бы один файл и защитил его с помощью chmod - сделав его недоступным для публики. Или, наоборот, сохраните содержимое в строке таблицы базы данных, извлеките его, когда это необходимо.

Сделать его загружаемым в виде файла. Для этого я получаю содержимое из защищенного файла или, если оно хранится в таблице базы данных, извлекает его и просто выводит. Используя заголовки php, я хотел бы указать желаемое имя, расширение, указать его тип и, наконец, заставить браузер загружать выходные данные в виде сплошного файла.

Таким образом, вам нужно сохранять данные только в одном месте, в защищенном файле или в базе данных. Заставить клиентский браузер загружать его столько раз, сколько условия соответствуют, например, до тех пор, пока пользователь входит в систему и т.д. Без необходимости беспокоиться о дискового пространства, создавая любой временный файл, cronJobs и или автоматически удаляя файл.