Защита от "чужих" ссылок

MagicGTS

Новичок
Защита от "чужих" ссылок

Видел на форуме такую тему, но когда понадобилась не смог отыскать.
Задача вот какая, определить что ссылка на скачиваемый файл (файл отдаётся скритом) была взята юзером с другого сайта. Если оно так, то показать фигу.
Идея мне понятна, и даже реализация работает, но вот тока многие жалуются что им фигу кажут даже если кликнули на ссылку с сайта :(
Вот код который использую, чувствую надо что-то добавить\изменить:
PHP:
if(isset($_SERVER['HTTP_REFERER']) && ""!=$_SERVER['HTTP_REFERER'])
{
	preg_match("/^(http:\/\/)?([^\/]+)/i", $_SERVER['HTTP_REFERER'], $matches);
	if(0==strcasecmp($matches[2], $_SERVER['SERVER_ADDR']) || 0==strcasecmp($matches[2], $_SERVER['SERVER_NAME']))
	{
		//Типа отдаем файл
	}
	else
	{
		//кажем фигу
	}
}
Возможно дело в проверке ""!=$_SERVER['HTTP_REFERER'] . Не все качалки выставляют эти хидеры, да и браузер может не ставить. Да мало ли кто может прибить это поле... Тут правда ньюанс ;) пока писал и проверял пост, обнаружил что вместо ""!=$_SERVER['HTTP_REFERER'] проверялось ""!=isset($_SERVER['HTTP_REFERER']) ,что и могло давать такие неприятные результаты.
Может у кого есть решение более красивое или полное? Поделитесь пожалста.
 

zarus

Хитрожопый макак
if(isset($_SERVER['HTTP_REFERER']) && ""!=$_SERVER['HTTP_REFERER'])
заменить на
if (!empty($_SERVER['HTTP_REFERER']))

-~{}~ 01.12.05 09:12:

могу предложить функцию, которая проверяет, откуда зашел юзверь и переадресует обратно, если это была страница с сайта, или на главную, если с другого сайта
PHP:
  function get_transit_url() {
    global $_SERVER;
    if (!empty($_SERVER["HTTP_REFERER"])) {
      if (strpos($_SERVER["HTTP_REFERER"],$_SERVER["SERVER_NAME"]) === false)
        $redir = $_SERVER["SERVER_NAME"];
      else
        $redir = $_SERVER["HTTP_REFERER"];
    }
    else {
      $redir = $_SERVER["SERVER_NAME"];
    }
    if (empty($redir)) {
      $redir = "/";
    }
    return $redir;
  }
Соответственно, доработай под свою задачу
 

MagicGTS

Новичок
Спасибо!
2zarus вот это решение понравилось
PHP:
if (strpos($_SERVER["HTTP_REFERER"],$_SERVER["SERVER_NAME"]) === false)
Совместить кучу проверок в одном месте.
2Фанат Да есть подозрение что чего-то нехватает...
 

asm

Пофигист
если так хочется уменьшить бесполезный трафик то нужно побумать а генерации ссылок на скачку. Каждый раз новая и действительная в короткий промкжуток времени :)
 

Фанат

oncle terrible
Команда форума
zarus
global $_SERVER; - это ты от большого ума написал? =)
а условий-то, условий... как в кголовном кодексе прям.
попроще быть не пробовал?

MagicGTS ну, если кажется, то почему бы не переделать программу в нужном направлении?
 

whirlwind

TDD infected, paranoid
>а условий-то, условий... как в кголовном кодексе прям.

Зачот! :D
 

Патриот

Новичок
Автор оригинала: MagicGTS
Спасибо!
2zarus вот это решение понравилось
PHP:
if (strpos($_SERVER["HTTP_REFERER"],$_SERVER["SERVER_NAME"]) === false)
А если $_SERVER["HTTP_REFERER"] будет содержать такое:

Код:
[url]http://mydomen.ru/download.php?go=1&[/url][b]you_server_name[/b]
 

MagicGTS

Новичок
Да есть такая засада. Можно ввести проверку смещения... Но выглядит оно неплохо, вот тока вероятность такой подставы велика. Регулярка дает больше надёжности.
А если использовать нечто вроде:
PHP:
preg_match("/^(http:\/\/){$_SERVER["HTTP_REFERER"]}([^\/]+)/i", $_SERVER['HTTP_REFERER'], $matches);
И сверять найдено (1) или не найдено (0). Тоже даёт неплохие результаты в плане сокращения условий.
Типа какой бы не был рефер (пустой, сайта или не моего сайта) то результат поиска выглядет очень предсказуемым... Вроде так?
 

zarus

Хитрожопый макак
Автор оригинала: Фанат
zarus
global $_SERVER; - это ты от большого ума написал? =)
а условий-то, условий... как в кголовном кодексе прям.
попроще быть не пробовал?
1. Не все же умными рождаются. Когда я эту проверку писал, я не знал различий между глобальными и суперглобальными переменными.
2. Дайте пример попроще, буду признателен.
 
Сверху