Как защитить файл от скачивания сторонним скриптом? PHP

Sanu0074
На сайте с 31.08.2012
Offline
110
1295

Есть скрипт который отправляет файл пользователя на сервер (картинку), рисует что-то на ней и возвращает ссылку на скачивание в браузер в виде JSON.

Задача в том, как правильно отдать этот файл юзеру, чтоб он смог забрать его только браузером, например чтоб никто не смог со своей странички отправить файл на мой скрипт который обрабатывает файл пользователя (картинку) и получить ссылку на скачивание и загрузить файл себе. Что можно придумать?

SD
На сайте с 20.07.2014
Offline
4
#1

1. Проверять заголовки

2. Генерировать не прямую ссылку, а с ключом, где ключ - результат хеш-функции от браузера.

3. Отправлять ссылку на почту, с просьбой открыть ее в том браузере, в котором загружали картинку

4. Для пущей важности использовать localStorage

SeVlad
На сайте с 03.11.2008
Offline
1609
#2
Sanu0074:
Что можно придумать?

Курить "антилич".

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
Sanu0074
На сайте с 31.08.2012
Offline
110
#3
SSL-Decision:
1. Проверять заголовки

их можно легко подделать

SSL-Decision:
2. Генерировать не прямую ссылку, а с ключом, где ключ - результат хеш-функции от браузера.

вот тут немного по подробнее пожалуйста, я не пойму как сгенерить этот ключ

SSL-Decision:
3. Отправлять ссылку на почту, с просьбой открыть ее в том браузере, в котором загружали картинку

не пойдет, т.к. это оч много действий для юзера, вместо этого как вариант капча пойдет...

SSL-Decision:
4. Для пущей важности использовать localStorage

тоже не вариант, большое количество устаревших арбузеров теряем

Оптимизайка
На сайте с 11.03.2012
Offline
396
#4

капча и куки, не?

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Sanu0074
На сайте с 31.08.2012
Offline
110
#5
Оптимизайка:
капча и куки, не?

капча да, но хотелось бы обойтись без нее

L
На сайте с 07.12.2007
Offline
351
#6
Sanu0074:
Задача в том, как правильно отдать этот файл юзеру, чтоб он смог забрать его только браузером, например чтоб никто не смог со своей странички отправить файл на мой скрипт который обрабатывает файл пользователя (картинку) и получить ссылку на скачивание и загрузить файл себе. Что можно придумать?

Подключите ajax - он запрещает кроссдоменные запросы.

После загрузки вашей формы в в браузер пользователя - по onLoad на сервер отправляется ajax-запрос. который генерит, например MD5( от текущего времени + IP пользователя).

Этот MD5 записывается в БД на сервере и ему ставится время жизни, допустим 3 часа. Устаревшие вычищать из таблицы по cron. Это не даст нагеренить правильных ответов для работы "левого скрипта".

Форма присылает на сервер файл и скрытое поле с ответом на этот ajax-запрос, поле сверяется с наличием в таблице. Если не совпало - пользователь левый, заново отправлять ему форму ввода файла.

Плюс - реферер проверяйте, браузеры сейчас не дают его подделать.

SD
На сайте с 20.07.2014
Offline
4
#7
2. Генерировать не прямую ссылку, а с ключом, где ключ - результат хеш-функции от браузера.


// уникальный токен пользователя
$token = sha1($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_HOST'] . $_SERVER['HTTP_ACCEPT ']);
// случайный ключ
$key = sha1(microtime() . mt_rand(10, 9999) . '%' . $token);
// хеш функция от ключа и токена пользователя
$hash = getHash($token, $key);

function getHash($token, $key){
return md5($token . '%somethingelse' . $key);
}

Теперь ссылка на файл выглядит следующим образом:


/getfille/[KEY]/[HASH]/[FILE_ID]/

А при скачивании файла, проверяете, сходится ли [HASH] с хешем, который получается при использовании вашей хеш функции:


//$token - генерируется скриптом так же с учетом $_SERVER-элементов
if ([HASH] == getHash($token, [KEY]){
}

P.S. Все можно довесить еще дополнительными javascript-обработчиками, чтобы токен был максимально уникальным.

Про то, что любого пользователя можно очень точно идентифицировать - https://panopticlick.eff.org/

P.S.S. Зачем поддерживаете старые браузеры?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий