За последние 24 часа нас посетили 61110 программистов и 1744 робота. Сейчас ищут 1096 программистов ...

Создание одноразовой ссылки

Тема в разделе "PHP для новичков", создана пользователем Yankovitz, 23 фев 2018.

  1. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Добрый день. Поделитесь пожалуйста идеями, как создать одноразовые ссылки для скачивания.
    Важное условие: невозможность узнать прямую ссылку на файл
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Пример?
     
  3. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Да. Или просто в общих чертах. Как я понимаю вариантов реализации масса. Нужно оптимальный в плане безопасности и удобства.
    --- Добавлено ---
    И еще, желательно без использования дополнительных файлов типа txt
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    в бд хэш заливаете , ссылку с хэшем отдаете юзеру. Он проходит по этой ссылке,
    site/download?hash=3453432g4343g342
    скрипт сверяет на существовании такого хэша в бд и отдает файл на скачивание

    бд:
    hash name time
    3453432g4343g342 || /download/revwvsvre/1.lol || время существовании этой ссылки (UNIX time)
     
    Yankovitz нравится это.
  5. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Как думаете, как реализовать хранение хэша для разных юзеров? Чтобы и база не захламлялась.
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    перед тем как отдавать файл, скрипт чистит просрочку
    --- Добавлено ---
    всмысле? ты просто заполняешь бд как в примере
     
  7. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Например, отдал я ссылку с хешем юзеру 1, в этот момент юзер 2 тоже запросил файл и скачивает его раньше юзера 1. В этот момент я чищу токен. Получается, что у юзер 1 будет не актуальный хеш.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    выскочет предупреждение что ссылка не активна или что - то подобное у юзера 1
     
  9. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Юзера от юзера тоже же надо отличать, поэтому, мне кажется, отдельная таблица, где ID-юзера, хэш, и идентификатор, скачал или не скачал. Можно подумать о времени жизни хэша, например, в куках.
    Ну а есть ли смысл чистить таблицу? если она будет отдельная, места много не займет(несколько Кбайт), периодически ее можно чистить (DROP-ать), во время профилактических работ.
     
  10. Yankovitz

    Yankovitz Активный пользователь

    С нами с:
    21 ноя 2014
    Сообщения:
    194
    Симпатии:
    6
    Тогда каким образом юзер 1 сможет вновь получить ссылку?
    --- Добавлено ---
    Согласен, есть зарегистрированный и незареганый
     
  11. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    не обязательно регистрироваться, зашел на сайт, получил куку, (а дальше с ним че хотите то и делайте с этим пользователем), получил ссылку - в куке хэш, еще раз ссылку получил в куке хеш перезаписался
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я предлагал как-то создавать линку на файл, чтобы файл отдавался вебсервером минуя пхп
    но идею я не тестировал.
     
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Предлагаю после первого же скачивания удалить ссылку на хеш в бд, тогда файл будет не доступен второй раз по этой же ссылке. Если он по какой то причине не скачал выдаёте ему такую же одноразвую ссылку через тех поддержку. А ссылку нужно конфигурировать именно так чтобы подбором она никогда не подобралась, а это не так сложно.
    --- Добавлено ---
    А ещё лучше запаролить ссылку и отдать лог и пас на почту пользователю, ну и всё , скачать может тот у кого есть пароль. Вот вам и безопасность.
    --- Добавлено ---
    Пароль уникален, для каждой созданной ссылки.
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    @askanim это слишком круто, ориентируясь на первый пост
    --- Добавлено ---
    так ссылка как бы тоже уникальна.

    если ее передать другому юзеру, это аналог тому что ты скажешь пароль для доступа
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    значит пароль + после того как зашёл скачал, удалилась ссылка.
    --- Добавлено ---
    работы от силы на три часа. Создать таблицу, для хранения данных о ссылках на файл, т. есть уник Id + хеш + имя файла которое будем качать, зашли значит по ссылку чекнули в бд этот хеш ага есть отдали файл, файл отдался ссылка удалилась (то бишь удалили строчку с бд, или пометили как уже отдавшуюся раздачу, и её больше не отдаём, а значит в логике уже изменения, добавляем поле в таблице какое нибудь аля check и взводим его в boolen по умолчанию храним в false, скачали поставили true, то бишь изначально чекаем ссылку и попутно проверяем false или true если false отдаём и в конце ставим true, А ещё фише дабы не засерать дб , удаляем строку из бд, а если надо хранить инфу о скачиваниях создаём некую дублёжную таблицу log_check, и скачаные строки ложим туда тогда алгоритм тоже слегка другой). Компренде. А то и на час работы
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    лишний блэкджек, одноразовая ссылка на мыло юзеру пришла и все, успел заюзать ? молодец.. скачал.. удалилась ссыль. Не успел по таймауту? пухом земля
    --- Добавлено ---
    зачем?
    если нужно вывести инфо про использованные ссылки, достаточно выбрать с условием "использованный презерватив"
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Подкину идею: саму уникальную сгорающую ссылку можно нигде не хранить. Ссылка может содержать в своём теле всю необходимую информацию, так зачем в какой-то базе её хранить? Можем смело генерировать такие ссылки "на лету" и не бояться накопить стопицот миллионов. Например поля из ссылки:
    - id ресурса
    - крайняя дата использования
    и опционально
    - id пользователя, которому дали право
    все эти переменные подписываем секретным ключем, например с помощью HMAC чтобы можно было проверить достоверность. Подпись также помещаем в ссылку.

    http://example.com/file?id=12345&until=20180308&crc=g69fe0ddcb7a

    Получили запрос на ресурс, выделили значимые поля, проверили подпись, проверили дату (и опционально пользователя). Eсли всё хорошо — отдаём ресурс. А нет, так лови гранату статус 403.

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

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