Шифрование уникальной ссылки для пользователя. Как реализовать?
Есть сайт который находится на одном сервере, и есть второй сервер на котором хранятся файлы.
Что бы другие сайты не размещали ссылки на скачивание у себя, тем самым создавай чрезмерную нагрузку на мой небольшой файловый сервер. Сделал генерирование уникальной ссылки для каждого пользователя. Для этого беру ip адрес пользователя, добавляю некую соль и шифрую в md5, полученный хеш добавляю в ссылку на скачивание. Когда пользователь переходит по ссылке на скачивание, файловый сервер так же само берет ip пользователя + соль, шифрует в md5 и полученный хеш сравнивает с тем что передается по ссылке, если хеши совпадает то сервер отдает файл.
Очень просто и эффективно.
Однако есть проблема, все больше пользователей начинает использовать VPN, и скачать файлы они не могут, так как когда пользователь заходит на сайт и ему генерируется ссылка, то в ссылку шифруется один ip адрес, а когда пользователь переходит по ссылке, то файловый сервер видит уже совсем другой ip, и хеши не совпадают. Так как VPN сервисы рандомно выбирают через какой прокси сервер отправить запрос пользователя, и ip постоянно меняется.
Какой еще есть простой способ, сделать для пользователя уникальную ссылку, которая будет работать только для него, но без использования ip адреса?
Повторюсь, ссылка генерируется на одном сервере а файл лежит на другом сервере, по этому использовать базу данных для хранения хешей и синхронизировать ее между серверами, достаточно проблематично.
Какой VPN? Чувак с телефоном зашел домой - и вот он уже не в мобильной сети, а в домашней, с совершенно другим айпишником. Проехал час на поезде - и вот у него уже не Северо-Запад, а Поволжье с другим диапазоном IP.
Забудьте уже про IP как метод определения чего бы то ни было.
Wispik, Пробовал делать на куках, но с ними какая то чертовщина творится. В одном браузере работает нормально, например в Гугл Хром, а в Фаерфоксе ни в какую не хочет работать. То есть когда пользователь заходит на сайт, устанавливается специальная кука, затем когда он переходит по ссылке скачивания, на файловый сервер отправляется эта кука, в хром работает отлично, а Фаерфокс ни в какую не отправляет эту куку на файловый сервер. Перепробовал все возможные настройки задавать куке при создании, не отправляет и все тут.
djok2142, и это нормально, ведь кука привязана к домену, а он у вас у второго сайта, скорее всего, отличается. Или вы при установке ставите именно домен второго сайта, где лежат файлы?
Самое простое решение - шифрование. На первом сайте шифруете строку содержащую дату и время + имя файла + соль, получаете строку для урл. На втором сайте расшифровываете тем же ключом (ну или можно использовать асимметричный шифр и тогда ключ будет публичным на 2 сервере). Если дата не устарела (например время жизни ссылки ставите 1 час и проверяете разницу дат создания ссылки и текущего времени).
Можно вообще отказаться от базы, и использовать JWT токен. В нём можно указать идентификатор пользователя в зашифрованном виде, время жизни ссылки и любую другую необходимую информацию. В базе данных ничего хранить не надо. Однако учтите, информация в JWT токене не зашифрована по умолчанию, любой может её из него вытащить. Прелесть JWT токена в том, что его нельзя изменить, потому что он подписан ключом шифрования. Это на случай, если база данных - драгоценный ресурс, который вы не хотите использовать.
А можно простой пример набросать? Не совсем понимаю что вы имеете в виду под "Уникальный идентификатор на скачивание". И что вы имеете в виду под "подписать эти данные"?
djok2142, ну или можно и без идентификатора, у тебя всё равно уже ссылка, просто время жизни этой ссылки, допустим N минут, если время прошло, то всё, отпинываешь. А подпись нужна, чтобы это время не подделали. Ты различаешь понятия зашифровать и подписать?
Отправляем пользователя скачивать файл по ссылке с случайной строкой.
Эту случайную строку сохранеям в базу (какой файл ей соответствует и до какого времени правильная).
Например к текущему времени прибавляем 1 час.
Файловый сервер (PHP + NGINX).
Полученный ключ (через апи или напрямую в муську на первый сервер).
Проверили время жизни. Узнали, что отдавать.
Спихнули задачу на nginx (см первую строку ответа)
Подумайте вот о чем: файл - это такая же часть сайта, как и страницы. Если на сайте используется аутентификации, то почему ее нельзя использовать для файлов?)