Защита файлов от скачивания по ссылкам с чужих сайтов на PHP
Очень неприятно, когда видишь, что трафик твоего сайта растет, а посетителей не прибавляется. И тут замечаешь, что "добрые люди" ставят ссылки на своих сайтах не на твою статью на твоем сайте, а непосредственное на твои файлы для скачивания. Вот от таких добрых людей и хочется сделать защиту. Она, конечно, не совершена, но от простых ссылок непорядочных людей, ворующих контент очень эффективна.
/*
Защита файлов от скачивания по ссылкам с чужих сайтов
ссылка на скачивание выглядит так:
http://example.com/antileech.php?down=4 <-- номер файла
или
http://example.com/antileech.php?down=filename <-- имя файла
*/
// Настройки
$antiurl = "htmlweb.ru"; // Разрешённый сайт (referer).
$antidir = $_SERVER['DOCUMENT_ROOT']."/download/"; // Папка где находятся защищённые от скачивания файлы
$logfile = "log.htm"; // Файл протокола (должен быть html или htm и обязательно CHMOD 777.
if (isset($logfile)) {
if (!file_exists($logfile)) die("Файл <font color='red'><b>$logfile</b></font> не найден!");
if (!is_writable($logfile)) die("Для файла <font color='red'><b>$logfile</b></font> нужно зделать CHMOD 777!");
if ($_SERVER['HTTP_REFERER'] == "")$cnr_data = "[не известно]";
else $cnr_data = "<a href=\"" . $_SERVER['HTTP_REFERER'] . "\">" . $_SERVER['HTTP_REFERER'] . "</a>";
$cnr_data = "<span style=\"color:green\">".$_SERVER['REMOTE_ADDR']."</span>
HOST <span style=\"color:red\">".gethostbyaddr($_SERVER['REMOTE_ADDR'])."</span>
visited on ".date("l d F H:i:s")." ссылка с ".$cnr_data."<br>";
@file_put_contents($_SERVER['DOCUMENT_ROOT'].$logfile, $cnr_data, FILE_APPEND);
}
// Проверка реферера
if (!stristr($_SERVER["HTTP_REFERER"], $antiurl) or !isset($_SERVER["HTTP_REFERER"]))
die('<h1>Файл по указанной ссылке не доступен!</h1>');
if (is_numeric($_GET["down"])){
// Здесь идут файлы для скачивания по номерам
if ($_GET["down"] == 1) $filename = "test1.rar";
elseif ($_GET["down"] == 2) $filename = "test2.rar";
elseif ($_GET["down"] == 3) $filename = "test3.rar";
}else $filename = $_GET["down"];
$path = $antidir . $filename; // Полная ссылка на файл
// Проверка файла есть он или нет
if (!file_exists($path)){
header("HTTP/1.0 404 Not Found");
die("Файл '$filename' не существует!");}
$ftime = date("D, d M Y H:i:s T", filemtime($path));
// Проверка
if (strstr($_SERVER["HTTP_REFERER"], $antiurl)) {
if (isset($_GET['down']) && isset($filename)) {
$fsize = filesize($path);
$ftime = date("D, d M Y H:i:s T", filemtime($path));
$fd = @fopen($path, "rb");
if (!$fd){header ("HTTP/1.0 403 Forbidden");exit; }
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) { // докачка
$range = $HTTP_SERVER_VARS["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if ($range) {fseek($fd, $range);}
}
$content = fread($fd, filesize($path));
fclose($fd);
if ($range) header("HTTP/1.1 206 Partial Content");
else header("HTTP/1.1 200 OK");
header("Content-Disposition: attachment; filename=" . basename($path));
header("Last-Modified: $ftime");
header("Accept-Ranges: bytes");
header("Content-Length: ".($fsize-$range));
header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
header("Content-type: application/octet-stream");
print $content;
exit;
} else die("Недействительный файл.");}
.
Прокомментировать/Отблагодарить