Я пишу сценарий загрузки с анти-leeching, и мой план состоит в создании временного файла, который называется идентификатором сеанса, а затем по истечении срока действия сеанса файл будет автоматически удален. Является ли это возможным ? И можете ли вы дать мне несколько советов, как это сделать на PHP?
Большое спасибо за любой ответ
Таким образом, у нас есть один или несколько файлов, доступных для загрузки. Создание временного файла для каждого запроса на загрузку – не очень хорошая идея. Создание symlink()
для каждого файла – гораздо лучшая идея. Это позволит сэкономить массу дискового пространства и снизить нагрузку на сервер.
Именование символической ссылки после сеанса пользователя – достойная идея. Лучшая идея состоит в том, чтобы генерировать случайное имя симпликации и ассоциировать с сеансом, поэтому скрипт может обрабатывать несколько загрузок за сеанс. Вы можете использовать session_set_save_handler()
( link ) и зарегистрировать пользовательскую функцию read
которая проверяет истекшие сеансы и удаляет символические ссылки по истечении срока действия сеанса.
PHP имеет функцию для этого имени tmpfile . Он создает временный файл и возвращает ресурс. Ресурс может использоваться как любой другой ресурс.
Например, пример из руководства:
<?php $temp = tmpfile(); fwrite($temp, "writing to tempfile"); fseek($temp, 0); echo fread($temp, 1024); fclose($temp); // this removes the file ?>
Файл автоматически удаляется при закрытии (с использованием fclose ()) или при завершении скрипта. Вы можете использовать любые функции файла на ресурсе. Вы можете найти их здесь . Надеюсь, что это поможет вам?
Другим решением было бы создать файл обычным способом и использовать cronjob для регулярной проверки, если срок действия сеанса истек. Дата истечения срока действия и другие данные сеанса могут храниться в базе данных. Используйте сценарий для запроса этих данных и определения срока действия сеанса. Если это так, удалите его физически с диска. Обязательно запускайте скрипт один раз в час (в зависимости от вашего таймаута).
Не могли бы вы объяснить свою проблему немного глубже? Потому что я не вижу причины, почему бы не использовать $_SESSION
. Данные в $_SESSION
хранятся на стороне сервера в файле (см. http://php.net/session.save-path ) BTW. По крайней мере, по умолчанию. 😉
Я бы посоветовал вам не копировать файл в первую очередь. Я бы сделал следующее: когда пользователь запрашивает файл, вы создаете случайную уникальную строку, чтобы дать ему ссылку следующим образом: dl.php?k=hd8DcjCjdCkk123
затем поместить эту строку в базу данных, сохраняя его IP-адрес, возможно, сеанс и время, когда вы создали ссылку. Затем другой пользователь запрашивает этот файл, убедитесь, что все вещи (хеш, ip и т. Д.) Совпадают, и ссылка не истекла (например, не больше, чем N часов прошло с момента генерации), и если все в порядке, используйте PHP для соединения файл. Задайте задание cron для просмотра базы данных и удаления устаревших записей. Как вы думаете?
tmpfile
Создает временный файл с уникальным именем в режиме чтения-записи (w +) и возвращает дескриптор файла. Файл автоматически удаляется при закрытии (с использованием fclose ()) или при завершении скрипта.
Итак, у нас есть следующие требования:
Посмотрим. Это не рабочий код , но он должен работать в следующих направлениях:
<?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, но если вы не уничтожите сеанс после отправки файла, вы можете написать счетчик сессии и ограничить количество файлов, которые пользователь будет отправлять во время сеанса.
Я искренне согласен с тем, что это можно было бы решить гораздо шире, чем с этим взломом в виде обезьян, но в качестве доказательства концепции это должно быть достаточно.
Может быть, поздно опоздать, но я пытаюсь поделиться своей функцией googlize!
если вы используете CPanel, есть короткий и быстрый способ блокировки внешнего запроса на ваших размещенных файлах, имя которого: HotLink .
вы можете включить HotLinks на Cpanel и убедиться, что никто не может запросить ваш файл с другого хостинга или использовать ваши файлы в качестве ссылки для скачивания.
Чтобы добиться этого, я сделал бы один файл и защитил бы его с помощью chmod – сделав его недоступным для публики. Или, наоборот, сохраните содержимое в строке таблицы базы данных, извлеките его, когда это необходимо.
Сделать его загружаемым в виде файла. Для этого я получаю содержимое из защищенного файла или, если оно хранится в таблице базы данных, извлекает его и просто выводит. Используя заголовки php, я хотел бы указать желаемое имя, расширение, указать его тип и, наконец, заставить браузер загружать выходные данные в виде сплошного файла.
Таким образом, вам нужно сохранить данные только в одном месте, в защищенном файле или в базе данных. Заставить клиентский браузер загружать его столько раз, сколько удовлетворяют условиям, например, при входе пользователя в систему и т. Д. Без необходимости беспокоиться о дискового пространства, создавая любой временный файл, cronJobs и или автоматически удаляя файл.