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

  • Автор темы Автор темы MagicGTS
  • Дата начала Дата начала

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']) ,что и могло давать такие неприятные результаты.
Может у кого есть решение более красивое или полное? Поделитесь пожалста.
 
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;
  }
Соответственно, доработай под свою задачу
 
Спасибо!
2zarus вот это решение понравилось
PHP:
if (strpos($_SERVER["HTTP_REFERER"],$_SERVER["SERVER_NAME"]) === false)
Совместить кучу проверок в одном месте.
2Фанат Да есть подозрение что чего-то нехватает...
 
если так хочется уменьшить бесполезный трафик то нужно побумать а генерации ссылок на скачку. Каждый раз новая и действительная в короткий промкжуток времени :)
 
zarus
global $_SERVER; - это ты от большого ума написал? =)
а условий-то, условий... как в кголовном кодексе прям.
попроще быть не пробовал?

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

Зачот! :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]
 
Да есть такая засада. Можно ввести проверку смещения... Но выглядит оно неплохо, вот тока вероятность такой подставы велика. Регулярка дает больше надёжности.
А если использовать нечто вроде:
PHP:
preg_match("/^(http:\/\/){$_SERVER["HTTP_REFERER"]}([^\/]+)/i", $_SERVER['HTTP_REFERER'], $matches);
И сверять найдено (1) или не найдено (0). Тоже даёт неплохие результаты в плане сокращения условий.
Типа какой бы не был рефер (пустой, сайта или не моего сайта) то результат поиска выглядет очень предсказуемым... Вроде так?
 
Автор оригинала: Фанат
zarus
global $_SERVER; - это ты от большого ума написал? =)
а условий-то, условий... как в кголовном кодексе прям.
попроще быть не пробовал?
1. Не все же умными рождаются. Когда я эту проверку писал, я не знал различий между глобальными и суперглобальными переменными.
2. Дайте пример попроще, буду признателен.
 
Сверху