Защищаем от хотлинкига

Один из клиентов попросил защитить от хотлинкинга скачивание файлов сервера. Наиболее простой и надежный механизм, не требующий внедрение сложных схем, добавления авторизации и прочего, это выдача уникальной ссылки для конкретного пользователя. Для этого понадобится nginx (а точнее его модуль secure_link_module)и в нашем случае, сайт на php.

Конфиг nginx в общем случае будет выглядеть так:
location ^~ /downloads/ {
secure_link $arg_hash,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr salt";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
alias /var/www/sites/data/www/test/files/;
}

где $arg_hash — $_GET[‘hash’] переменная hash кодирующая ссылку, а $arg_expires — $_GET[‘expires’] содержащее время «протухания» ссылки, а salt — «соль» которой добавляем уникальность (как вариант, можно добавлять в secure_link_md5 user_agent или любые другие переменные). Я использую alias, так как физически имя папки в url отличается от фактической в файловой системе.

Генерация ссылки на php происходит следующим образом:

$salt="salt";
$time = time() + 10800;
$file="/downloads/file.rar"
$hash=md5($time."/".$file.$_SERVER['REMOTE_ADDR']." ".$salt,TRUE);
$hash = strtr( base64_encode($hash), array( '+' => '-', '/' => '_', '=' => '' ));
$link="http://test.com".$file."?hash=".$hash."&expires=".$time;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *