@djok2142

Шифрование уникальной ссылки для пользователя. Как реализовать?

Есть сайт который находится на одном сервере, и есть второй сервер на котором хранятся файлы.
Что бы другие сайты не размещали ссылки на скачивание у себя, тем самым создавай чрезмерную нагрузку на мой небольшой файловый сервер. Сделал генерирование уникальной ссылки для каждого пользователя. Для этого беру ip адрес пользователя, добавляю некую соль и шифрую в md5, полученный хеш добавляю в ссылку на скачивание. Когда пользователь переходит по ссылке на скачивание, файловый сервер так же само берет ip пользователя + соль, шифрует в md5 и полученный хеш сравнивает с тем что передается по ссылке, если хеши совпадает то сервер отдает файл.
Очень просто и эффективно.
Однако есть проблема, все больше пользователей начинает использовать VPN, и скачать файлы они не могут, так как когда пользователь заходит на сайт и ему генерируется ссылка, то в ссылку шифруется один ip адрес, а когда пользователь переходит по ссылке, то файловый сервер видит уже совсем другой ip, и хеши не совпадают. Так как VPN сервисы рандомно выбирают через какой прокси сервер отправить запрос пользователя, и ip постоянно меняется.

Какой еще есть простой способ, сделать для пользователя уникальную ссылку, которая будет работать только для него, но без использования ip адреса?
Повторюсь, ссылка генерируется на одном сервере а файл лежит на другом сервере, по этому использовать базу данных для хранения хешей и синхронизировать ее между серверами, достаточно проблематично.
  • Вопрос задан
  • 2095 просмотров
Пригласить эксперта
Ответы на вопрос 6
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Самое простое решение - шифрование. На первом сайте шифруете строку содержащую дату и время + имя файла + соль, получаете строку для урл. На втором сайте расшифровываете тем же ключом (ну или можно использовать асимметричный шифр и тогда ключ будет публичным на 2 сервере). Если дата не устарела (например время жизни ссылки ставите 1 час и проверяете разницу дат создания ссылки и текущего времени).
Ответ написан
Комментировать
Можно вообще отказаться от базы, и использовать JWT токен. В нём можно указать идентификатор пользователя в зашифрованном виде, время жизни ссылки и любую другую необходимую информацию. В базе данных ничего хранить не надо. Однако учтите, информация в JWT токене не зашифрована по умолчанию, любой может её из него вытащить. Прелесть JWT токена в том, что его нельзя изменить, потому что он подписан ключом шифрования. Это на случай, если база данных - драгоценный ресурс, который вы не хотите использовать.
Ответ написан
Комментировать
@Everything_is_bad
Уникальный идентификатор на скачивание + время его жизни, можно даже не шифровать, достаточно подписать эти данные, и всё.
Ответ написан
402d
@402d
начинал с бейсика на УКНЦ в 1988
X-Accel-Redirect - гуглим такую фишку у nginx

Отправляем пользователя скачивать файл по ссылке с случайной строкой.
Эту случайную строку сохранеям в базу (какой файл ей соответствует и до какого времени правильная).
Например к текущему времени прибавляем 1 час.

Файловый сервер (PHP + NGINX).
Полученный ключ (через апи или напрямую в муську на первый сервер).
Проверили время жизни. Узнали, что отдавать.
Спихнули задачу на nginx (см первую строку ответа)
Ответ написан
Комментировать
@Le0Wolf
C# Developper
Подумайте вот о чем: файл - это такая же часть сайта, как и страницы. Если на сайте используется аутентификации, то почему ее нельзя использовать для файлов?)
Ответ написан
LaRN
@LaRN
Senior Developer
В качестве уникальной ссылки можно использовать обычный guid. Почти нулевая верятность дублирования.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы