Главная > Вебмастеру > Защита DLE от внешних ссылок и сохранение пропорций изображений при импорте RSS.

Защита DLE от внешних ссылок и сохранение пропорций изображений при импорте RSS.

Любому, даже начинающему сеошнику, должно быть известно, что наличие большого количества внешних ссылок отрицательно сказывается на ТИЦ, PR, да и на самом продвижении в целом. Ссылка просто передает вес с вашего сайта. Для заглушки такой передачи в поисковых системах Google и Яндекс придумали rel="nofollow" и <noindex> (для Google и Яндекс соотвественно). Этого нам будет недостаточно.

Речь пойдет о DLE (Data Life Engine) и о ее возможности импорта новостей через канал RSS. Рассмотрим конкретную ситуацию, тогда станет ясно, чего мы хотим добиться.

Задача №1.
Мы грабим (импортируем) новости с другого сайта, у нас все настроено, поэтому процесс проходит хорошо, текстовые новости без каких-либо проблем и косяков попадают в базу данных нашего сайта и теперь находятся на нем. Теперь допустим, что нам попалась новость о выходе какого-то нового супер-пупер фильма (музыкального альбома, очередной операционной системы, антивируса и тп, не суть важно). В теле этой новости помимо описания присутствует ссылка для скачивания. DLE во время импорта новостей грабит "все как есть", поэтому на вашем сайте эта опубликованная новость будет содержать внешнюю ссылку на сайт жертвы, с которого вы только что все забрали. Нам это не нужно. Варианта решения этой проблемы три:

  1. Самый простой и честный — не грабить и оставить все подобные мысли и попытки. Этот вариант не рассматриваем.
  2. Закрывать внешние ссылки rel="nofollow" и <noindex>. Вроде бы такой вариант должен быть хорош, однако на любом сервисе проверки seo-параметров вашего сайта (например, pr-cy.ru) такие ссылки все равно будут называться внешними, ссылочный вес, конечно, на них передаваться не будет, но, например в Sape, эти ссылки будут в числе внешних, что может оттолкнуть потенциального покупателя.
  3. Использовать метод от SEOMAX`a. Способ действительно хорош и широко применяется многими вебмастерами. Здесь я его приводить не буду, поскольку это не этично, посетите страницу автора, там есть инструкция по применению — Защита DataLife Engine от внешних ссылок .

Для поставленной задачи эти решения вполне подходят. Рассмотрим более реальную задачу.

Задача №2.
Среди импортируемых новостей попалась фотоподборка или какой другой материал с большим количеством изображений. Как я уже говорил, если вы пользуетесь стандартным модулем импорта, то получите новость "как есть", а следовательно все изображения будут выглядеть как внешние ссылки на сайт донора, это просто seo-беда. Вариантов решения проблемы тоже три:

  1. Не грабить такие новости.
  2. Использовать сторонний модуль импорта (граббер), которые широко продаются на многих сео-форумах и сео-сайтах.
  3. Включить мозг и попытаться подумать. А что мешает нам использовать уже упомянутый способ SEOMAX`a ??? А лентяям и тем, кто не хочет думать, помешать может только то, что сам SEOMAX свой способ на такие задачи не рассчитывал, поэтому мы не можем его просто взять и использовать :) . Мы его немного модернизируем.

Нам потребуется файл engine/classes/parse.class.php из DLE и какой-нибудь текстовый редактор. Кроме того, вы должны будете проделать все пункты из метода SEOMAX`a прежде, чем читать далее.

Изображения могут импортироваться в виде [thumbs] или в виде [img]. Между ними есть небольшое отличие. Возможно, картинки на сайте-доноре не подходят по размеру под ваш шаблон. В настройках DLE есть пункт, в котором вы можете указать максимальный размер, из которого уже и будут рассчитываться пропорции, но эта настройка действует только на изображения, которые импортированы с тегом [img], с [thumbs] она работать не будет! Поэтому нам нужно это тоже учесть. Ниже приведены коды двух функций, которые нужно просто вставить вместо имеющихся в файле engine/classes/parse.class.php. Комментарии тут не требуются, для обработки внешних ссылок используется метод SEOMAX`a, для обработки пропорций изображений используется стандартный алгоритм DLE, применяемый для [img], ничего сложного, кто захочет — разберется без проблем.

Для [img]:

function build_image($url = "", $align = "") {
		global $config;

		$url = trim( $url );
		$url = urldecode( $url );
		$option = explode( "|", trim( $align ) );
		$align = $option[0];
		$img_extra = " ";

		if( $align != "left" and $align != "right" ) $align = '';

		if( preg_match( "/[?&;%<\[\]]/", $url ) ) {

			if( $align != "" ) return "[img=" . $align . "]" . $url . "[/img]";
			else return "[img]" . $url . "[/img]";

		}

		$url = $config['http_home_url']."go/?" . $this->clear_url( urldecode( $url ) );

		if( $url == "" ) return;

		if( $option[1] != "" ) {

			$alt = htmlspecialchars( strip_tags( stripslashes( $option[1] ) ), ENT_QUOTES );
			$alt = "alt=\"" . $alt . "\" title=\"" . $alt . "\" ";

		} else {

			$alt = htmlspecialchars( strip_tags( stripslashes( $_POST['title'] ) ), ENT_QUOTES );
			$alt = "alt='" . $alt . "' title='" . $alt . "' ";

		}

		if( intval( $config['tag_img_width'] ) ) {

			if (clean_url( $config['http_home_url'] ) != clean_url ( $url ) ) {

				$img_info = @getimagesize( $url );

				if( $img_info[0] > $config['tag_img_width'] ) {

					$out_heigh = ($img_info[1] / 100) * ($config['tag_img_width'] / ($img_info[0] / 100));
					$out_heigh = floor( $out_heigh );
					$img_extra = " width='{$config['tag_img_width']}' height='{$out_heigh}' onmouseover=\"this.style.cursor='pointer';\" onclick=\"return hs.expand(this, { src: '$url' });\" ";

				}
			}
		}

		$img_extra .= $alt;

		if( $align == '' ) return "<img src=\"$url\"{$img_extra}/>";
		else return "<img src=\"$url\" align=\"$align\"{$img_extra}/>";
	}

Для [thumbs]:

function build_thumb($gurl = "", $url = "", $align = "") {
	    global $config;
		$url = $config['http_home_url']."go/?" . trim( $url );
		$gurl = trim( $gurl );
		$option = explode( "|", trim( $align ) );
		$img_extra = " ";

		$align = $option[0];

		if( $align != "left" and $align != "right" ) $align = '';

		if( preg_match( "/[?&;%<\[\]]/", $gurl ) ) {

			if( $align != "" ) return "[thumb=" . $align . "]" . $gurl . "[/thumb]";
			else return "[thumb]" . $gurl . "[/thumb]";

		}

		$url = $this->clear_url( urldecode( $url ) );
		$gurl = $config['http_home_url']."go/?" . $this->clear_url( urldecode( $gurl ) );

		if( $gurl == "" or $url == "" ) return;

		if( $option[1] != "" ) {

			$alt = htmlspecialchars( strip_tags( stripslashes( $option[1] ) ), ENT_QUOTES );
			$caption = "<span class=\"highslide-caption\">" . $alt . "</span>";
			$alt = "alt=\"" . $alt . "\" title=\"" . $alt . "\" ";

		} else {

			$alt = htmlspecialchars( strip_tags( stripslashes( $_POST['title'] ) ), ENT_QUOTES );
			$alt = "alt='" . $alt . "' title='" . $alt . "' ";
			$caption = "";

		}

		if( intval( $config['tag_img_width'] ) ) {

			if (clean_url( $config['http_home_url'] ) != clean_url ( $url ) ) {

				$img_info = @getimagesize( $url );

				if( $img_info[0] > $config['tag_img_width'] ) {

					$out_heigh = ($img_info[1] / 100) * ($config['tag_img_width'] / ($img_info[0] / 100));
					$out_heigh = floor( $out_heigh );
					$img_extra = " width='{$config['tag_img_width']}' height='{$out_heigh}' ";

				}
			}
		}

		$img_extra .= $alt;

		if( $align == '' ) return "<!--TBegin--><a href=\"$gurl\" onclick=\"return hs.expand(this)\"><img src=\"$url\"{$img_extra}/></a>{$caption}<!--TEnd-->";
		else return "<!--TBegin--><a href=\"$gurl\" onclick=\"return hs.expand(this)\"><img align=\"$align\" src=\"$url\"{$img_extra}/></a>{$caption}<!--TEnd-->";

	}

После такой замены, все ссылки на сайт-жертву принимают примерно такой вид:


http://your.site/go/?http://victim.site/1254255069_1.jpg

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

Функция build_image:

	function build_image($url = "", $align = "") {
		global $config;

		$url = trim( $url );
		$url = urldecode( $url );
		$option = explode( "|", trim( $align ) );
		$align = $option[0];
		$img_extra = " ";

		if( $align != "left" and $align != "right" ) $align = '';

		if( preg_match( "/[?&;%<\[\]]/", $url ) ) {

			if( $align != "" ) return "[img=" . $align . "]" . $url . "[/img]";
			else return "[img]" . $url . "[/img]";

		}

		if($this->check_home($url) || $this->check_friends($url['html']))
        {
            $url = $this->clear_url( urldecode( $url ) );
        }
        else
        {
            $url = $config['http_home_url']."go/?" . $this->clear_url( urldecode( $url ) );
        }

		if( $url == "" ) return;

		if( $option[1] != "" ) {

			$alt = htmlspecialchars( strip_tags( stripslashes( $option[1] ) ), ENT_QUOTES );
			$alt = "alt=\"" . $alt . "\" title=\"" . $alt . "\" ";

		} else {

			$alt = htmlspecialchars( strip_tags( stripslashes( $_POST['title'] ) ), ENT_QUOTES );
			$alt = "alt='" . $alt . "' title='" . $alt . "' ";

		}

		if( intval( $config['tag_img_width'] ) ) {

			if (clean_url( $config['http_home_url'] ) != clean_url ( $url ) ) {

				$img_info = @getimagesize( $url );

				if( $img_info[0] > $config['tag_img_width'] ) {

					$out_heigh = ($img_info[1] / 100) * ($config['tag_img_width'] / ($img_info[0] / 100));
					$out_heigh = floor( $out_heigh );
					$img_extra = " width='{$config['tag_img_width']}' height='{$out_heigh}' onmouseover=\"this.style.cursor='pointer';\" onclick=\"return hs.expand(this, { src: '$url' });\" ";

				}
			}
		}

		$img_extra .= $alt;

		if( $align == '' ) return "<img src=\"$url\"{$img_extra}/>";
		else return "<img src=\"$url\" align=\"$align\"{$img_extra}/>";
	}

Функция build_thumb:

	function build_thumb($gurl = "", $url = "", $align = "") {
	    global $config;
		$url = trim( $url );
		$gurl = trim( $gurl );
		$option = explode( "|", trim( $align ) );
		$img_extra = " ";

		$align = $option[0];

		if( $align != "left" and $align != "right" ) $align = '';

		if( preg_match( "/[?&;%<\[\]]/", $gurl ) ) {

			if( $align != "" ) return "[thumb=" . $align . "]" . $gurl . "[/thumb]";
			else return "[thumb]" . $gurl . "[/thumb]";

		}

		if($this->check_home($url) || $this->check_friends($url['html']))
        {
            $url = $this->clear_url( urldecode( $url ) );
            $gurl = $this->clear_url( urldecode( $gurl ) );
        }
        else
        {
            $url = $config['http_home_url']."go/?" . $this->clear_url( urldecode( $url ) );
            $gurl = $config['http_home_url']."go/?" . $this->clear_url( urldecode( $gurl ) );
        }

		if( $gurl == "" or $url == "" ) return;

		if( $option[1] != "" ) {

			$alt = htmlspecialchars( strip_tags( stripslashes( $option[1] ) ), ENT_QUOTES );
			$caption = "<span class=\"highslide-caption\">" . $alt . "</span>";
			$alt = "alt=\"" . $alt . "\" title=\"" . $alt . "\" ";

		} else {

			$alt = htmlspecialchars( strip_tags( stripslashes( $_POST['title'] ) ), ENT_QUOTES );
			$alt = "alt='" . $alt . "' title='" . $alt . "' ";
			$caption = "";

		}

		if( intval( $config['tag_img_width'] ) ) {

			if (clean_url( $config['http_home_url'] ) != clean_url ( $url ) ) {

				$img_info = @getimagesize( $url );

				if( $img_info[0] > $config['tag_img_width'] ) {

					$out_heigh = ($img_info[1] / 100) * ($config['tag_img_width'] / ($img_info[0] / 100));
					$out_heigh = floor( $out_heigh );
					$img_extra = " width='{$config['tag_img_width']}' height='{$out_heigh}' ";

				}
			}
		}

		$img_extra .= $alt;

		if( $align == '' ) return "<!--TBegin--><a href=\"$gurl\" onclick=\"return hs.expand(this)\"><img src=\"$url\"{$img_extra}/></a>{$caption}<!--TEnd-->";
		else return "<!--TBegin--><a href=\"$gurl\" onclick=\"return hs.expand(this)\"><img align=\"$align\" src=\"$url\"{$img_extra}/></a>{$caption}<!--TEnd-->";

	}

А эта ссылка считается всеми сервисами уже внутренней.
Такой способ граббинга для прожженных пиратов — минимум загрузки контента на свой сайт при отсутствии внешних ссылок, в то время, когда весь материал находится на чужом сайте. Сайт-жертва может очень легко защититься от подобной кражи, но это совсем другая история :D .
Надеюсь, кому-нибудь пригодится. Жду комментариев.
А эта ссылка считается всеми сервисами уже внутренней.

Такой способ граббинга для прожженных пиратов — минимум загрузки контента на свой сайт при отсутствии внешних ссылок, в то время, когда весь материал находится на чужом сайте. Сайт-жертва может очень легко защититься от подобной кражи, но это совсем другая история :D .

Надеюсь, кому-нибудь пригодится. Жду комментариев.

  1. admin
    30 Октябрь 2009 в 15:21 | #1

    Готовится обновление к данному хаку.

  2. SEOshnik
    7 Ноябрь 2009 в 15:04 | #2

    И когда его ждать ?!

  3. admin
    7 Ноябрь 2009 в 20:23 | #3

    В понедельник (09.11.2009). Радует, что блог кто-то читает :) .

  4. admin
    9 Ноябрь 2009 в 10:09 | #4

    Выложено обещанное обновление.

  5. Intel
    21 Февраль 2010 в 13:16 | #5

    Интересный способ=)
    Наверное у меня был глюк… но первый раз когда я столкнулся с импортом rss в dle, то мне казалось что у него стоит такая функция, как загрузка изображений на свой сервер… тогда не использовал rss, а теперь понадобилось… и думаю есть ли такое решение?

  6. ZeDDy
    1 Август 2010 в 07:30 | #6

    А не знаешь как обойти защиту хотлинк для изображений импортируемых с других сайтов?

  7. 1 Август 2010 в 19:48 | #7

    Неа, от этой темы отошел пока.

  8. Kiev znakhar
    25 Март 2011 в 01:51 | #8

    Отличный у Вас сайтец. Добавляю в закладки.

  1. Пока что нет уведомлений.