Защита от спама: php скрипт для проверки трекбеков

Владимир | | PHP, WordPress.

Спам в трекбеках

Спамерские технологии не стоят на месте. Все-таки изобретательные эти люди 🙂

В одном из последних постов на Blue Hat SEO как раз и описан один из таких способов.

Вкратце идея следующая. Создается страница со ссылками на различные блоги. И на них же отправляются трекбеки. Т.е. на этих блогах, обычно в разделе комментариев, появляются ссылки на эту страницу.

Естественно, владельцы блогов начинают проверять спамерскую страницу на наличие обратной ссылки на свой блог. Видят, что ссылка на месте и не удаляют трекбек.

Примечание. Эту проверку не обязательно делать вручную. Автоматизировать эту работу можно с помощью плагина для WordPress — Trackback Validator Plugin.

Через несколько дней спамер кардинальным образом изменяет страницу. Например, превращает в дорвей. Все ссылки на блоги с нее естественно удаляются.

Т.е. получается, что нужно периодически проверять страницы, с которых отправлены трекбеки на наличие обратных ссылок.

Делать это вручную – нереально. Поэтому я написал небольшой php скрипт, который автоматически выполняет эти проверки. Если его запускать cron’ом, то вы всегда будете в курсе наличия обратных ссылок.

Рассмотрим, как он работает.

define('SITE_URL', 'your_blog_url'); //URL, который нужно проверять

/**
 * Настройки подключения к БД
 */ 

define('DB_NAME', 'your_db_name');
define('DB_HOST', 'your_db_host');
define('DB_USER', 'your_db_user');
define('DB_PASS', 'your_db_pass');
define('DB_TABLE_PREFIX', 'wp_'); //измените, если вы используете другой префикс таблиц

/**
 * Адрес почты для отправки отчета
 */
define('MAIL_ADDRESS', 'your_email');

$log = '';

//подключаемся к базе
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS)
    or die("Could not connect : " . mysql_error());
//выбираем БД
mysql_select_db(DB_NAME)
    or die("Could not select database");

// получаем список трекбеков (не отмеченных как спам, с ними будет разбираться // Akismet) $qFindTrackbacks = 'SELECT * FROM '.DB_TABLE_PREFIX. 'comments WHERE comment_type="trackback" AND comment_approved<>"spam"'; $result = mysql_query($qFindTrackbacks) or die("Trackback search failed : " . mysql_error()); //------------- ищем обратные ссылки ---------------------// //инициализация cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); while ($curTrackback = mysql_fetch_array($result, MYSQL_ASSOC)) { curl_setopt($ch, CURLOPT_URL, $curTrackback['comment_author_url']); $page = curl_exec($ch); if ($page != null) { $log .= 'Receive page '.$curTrackback['comment_author_url'].'\n<br />'; } //проверяем наличие обратной ссылки if (substr_count($page, SITE_URL) < 1) { //добавляем запись о том, что найден подозрительный трекбек $log .= 'Found trackback without backlink : '.$curTrackback['comment_author_url'].'\n<br />'; } } curl_close($ch); //закрываем соединение mysql_close($link); //отправляем письмо с отчетом if ($log == '') { $log .= 'Bad trackbacks not found'; } mail(MAIL_ADDRESS, 'Trackback search', $log, 'From: Trackback checker script') or die("Could not send report"); //скрипт нормально завершил работу exit(0);

Алгоритм довольно простой.

Сначала вы указываете ваши параметры подключения к базе данных, URL блога и email на который будет отправлен отчет с результатами проверки.

Затем скрипт подключается к базе данных и находит все трекбеки (строки 29-32).

Примечание. Трекбеки, отмеченные как «spam» мы пропускаем, т.к. они на страницах блога не отображаются и могут быть легко удалены из админ-панели.

После этого с помощью cURL скрипт получает страницы и ищет на них ссылки на ваш блог (строки 40-51). Если он находит хотя бы одну ссылку, то трекбек пропускается. А вот если ссылок нет, то в отчет (переменную $log) заносится адрес страницы.

Тут может возникнуть вполне закономерный вопрос. Почему не удалять сразу эти трекбеки? Дело в том, что во время страница может быть недоступна. Например, если ведутся технические работы. Поэтому окончательное решение об удалении ссылки скрипт оставляет вам.

Когда все проверки будут выполнены, скрипт отправит вам письмо с отчетом (строка 62).

Внимание! При работе данного скрипта могут возникнуть проблемы для блогов с большим количеством трекбеков (в виде нагрузки на сервер).
Если кто-то столкнется с такой проблемой – пишите в комментариях. И хотя бы примерно укажите количество трекбеков. Я переделаю скрипт так чтобы снизить нагрузку.

Небольшое дополнение.

На данный момент (по моим наблюдениям) большинство спамеров просто отправляют трекбеки без обратных ссылок. Наверное, надеются, что владелец блога ленивый и проверять их не будет 😉 .

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

И в заключение немного теоретических сведений о самих трекбеках и пингбеках (аналогичная технология).

В подробности вдаваться не буду, технической информации на эту тему валом. Только перечислю несколько пунктов, которые должен знать и учитывать каждый блоггер.

1) В идеале трекбек отправляется, когда один блоггер ссылается на другого. Естественно, движки блогов должны поддерживать эту технологию.

2) Трекбеки можно запретить в админ-панели WordPress (так же как и комментирование).

3) Трекбек можно отправить без установки обратной ссылки (чем и пользуются спамеры).

4) В отличие от комментариев для отправки трекбека не нужно вводить captcha. Это полностью автоматизированная технология, что и делает ее привлекательной для спамеров.

5) Исходя из моего опыта ~ 90% спама в трекбеках фильтруется Akismet'ом. Правда в большинстве случаев они были напичканы ключевиками фарма тематики.

Как видите, со спамом можно довольно успешно бороться 😉

Если скрипт вас заинтерисовал — качайте архив:
Скачать скрипт

P.S. Меня, как блоггера очень интересует эта тема. Если у вас есть замечание или вы хотите поделится своим опытом – пишите в комментариях.

  • Даже не задумывался, что трекбэками можно спамить 🙂

    Я кстати, недавно написал статью, отделить в шаблоне трекбэки от комментариев.

    • Я тоже не задумывался, пока не начал получать по несколько десятков таких трекбеков в день.

      Кстати, ваша статья мне понравилась. Когда-то была мысль реализовать разделение в этом блоге, но потом забыл, а острой необходимости не возникало.

  • Даже не задумывался, что трекбэками можно спамить 🙂

    Я кстати, недавно написал статью, отделить в шаблоне трекбэки от комментариев.

    • Я тоже не задумывался, пока не начал получать по несколько десятков таких трекбеков в день.

      Кстати, ваша статья мне понравилась. Когда-то была мысль реализовать разделение в этом блоге, но потом забыл, а острой необходимости не возникало.

  • Владимир, я вчера хотел написать почти аналогичную статью, только с немного другим предисловием (цель статьи — проверка наличия ссылки, но не трекбека). Вы не против, если я ее все же напишу? )) Мы оба читаем наши блоги, насколько я понимаю. Не хотел бы, чтобы Вы решили, будто это плагиат — я задумал это еще неделю раньше, но не успел из-за работы дописать скрипт.

    • Конечно не против.
      Вы же пишете свою статью и свой скрипт, а не копируете мою.
      И мне в любом случае интересно 😉

      Кстати, если бы блоггеры спрашивали друг у друга разрешения писать на похожие темы, то читать комменты было бы не реально 🙂

  • Владимир, я вчера хотел написать почти аналогичную статью, только с немного другим предисловием (цель статьи — проверка наличия ссылки, но не трекбека). Вы не против, если я ее все же напишу? )) Мы оба читаем наши блоги, насколько я понимаю. Не хотел бы, чтобы Вы решили, будто это плагиат — я задумал это еще неделю раньше, но не успел из-за работы дописать скрипт.

    • Конечно не против.
      Вы же пишете свою статью и свой скрипт, а не копируете мою.
      И мне в любом случае интересно 😉

      Кстати, если бы блоггеры спрашивали друг у друга разрешения писать на похожие темы, то читать комменты было бы не реально 🙂

  • Кстати, тут есть косяк, из-за которого я не уверен, будет ли работать скрипт. А именно — время выполнения скрипта. Обычно оно равно 30 секундам. Если предположить, что на проверку одного сайта уходить 5 секунд, то этого не хватит даже на 10 трекбеков!

    Учитывая, что обычно блоги хостятся на обычных хостингах, то там как раз 30 секунд и дают.

    Конечно, есть способы это обойти. Но это скрипт уже побольше и статья с описанием подлиннее. 😉 я у себя напишу потом.

    • Да, я знаю.
      ИМХО самый простой способ обойти эту проблему — использовать curl_multi_exec и, если трекбеков очень много, проверять список по частям.
      Но у меня практически не было таких трекбеков, а хотелось бы хотябы приблизительно знать на какое количество нужно ориентироваться.
      Поэтому, если кто-то столкнулся с проблемой и напишет сколько примерно трекбеков нужно проверять, я переделаю скрипт.
      Но пока смысла не вижу этим заниматься.

      Опять же, будет интересно взглянуть на вашу реализацию 🙂

    • На данный момент я большие скрипты я предлагаю скачать в архиве.

  • Кстати, тут есть косяк, из-за которого я не уверен, будет ли работать скрипт. А именно — время выполнения скрипта. Обычно оно равно 30 секундам. Если предположить, что на проверку одного сайта уходить 5 секунд, то этого не хватит даже на 10 трекбеков!

    Учитывая, что обычно блоги хостятся на обычных хостингах, то там как раз 30 секунд и дают.

    Конечно, есть способы это обойти. Но это скрипт уже побольше и статья с описанием подлиннее. 😉 я у себя напишу потом.

    • Да, я знаю.
      ИМХО самый простой способ обойти эту проблему — использовать curl_multi_exec и, если трекбеков очень много, проверять список по частям.
      Но у меня практически не было таких трекбеков, а хотелось бы хотябы приблизительно знать на какое количество нужно ориентироваться.
      Поэтому, если кто-то столкнулся с проблемой и напишет сколько примерно трекбеков нужно проверять, я переделаю скрипт.
      Но пока смысла не вижу этим заниматься.

      Опять же, будет интересно взглянуть на вашу реализацию 🙂

    • На данный момент я большие скрипты я предлагаю скачать в архиве.

  • У меня еще замечание есть по блогу Вашему.

    Код с сайта просто так не скопируешь. Во-первых, копируются знаки # (это, видимо, номера строк так криво копируются). Во-вторых, одиночные кавычки копируются как `, что плохо. Это все не сложно поправить, но если кода много, то можно что-то не заметить и это превратится в довольно утомительный поиск ошибки 🙁 Посмотрите мой блог, там все с этим ок — скопировал прямо с сайта, вставил в редактор и хоть сразу запускай 😉

    • Согласен… Давно откладываю эту проблему.
      Немного о причинах я уже писал.
      У вас все копируется хорошо, но нет номеров строк, а я люблю на них ссылаться 😉
      Кардинально решить проблему можно если использовать подсветку javascript'ом, а не на стороне сервера. У многих так и сделано. Но проблема в том, что такую подсветку может не показать RSS ридер, а это тоже плохо.

  • У меня еще замечание есть по блогу Вашему.

    Код с сайта просто так не скопируешь. Во-первых, копируются знаки # (это, видимо, номера строк так криво копируются). Во-вторых, одиночные кавычки копируются как `, что плохо. Это все не сложно поправить, но если кода много, то можно что-то не заметить и это превратится в довольно утомительный поиск ошибки 🙁 Посмотрите мой блог, там все с этим ок — скопировал прямо с сайта, вставил в редактор и хоть сразу запускай 😉

    • Согласен… Давно откладываю эту проблему.
      Немного о причинах я уже писал.
      У вас все копируется хорошо, но нет номеров строк, а я люблю на них ссылаться 😉
      Кардинально решить проблему можно если использовать подсветку javascript'ом, а не на стороне сервера. У многих так и сделано. Но проблема в том, что такую подсветку может не показать RSS ридер, а это тоже плохо.

  • Ох, ешкин кот… Сколько комментариев. Но нужно, нужно.

    substr_count($page, SITE_URL) — это не проверка наличия ссылки. это проверка наличия такого текста ВООБЩЕ, то есть это может быть и не ссылка. это не 100% ый результат

    • и тут вы тоже правы 🙂
      но если спамер будет переделывать страницу, то вряд ли он оставит даже такой текст.

      Вообще тут много вопросов. Например, что делать если ссылка не прямая?
      site.domen/?goto=http://www.simplecoding.org
      Или ссылка реализована javascript'oм?

  • Ох, ешкин кот… Сколько комментариев. Но нужно, нужно.

    substr_count($page, SITE_URL) — это не проверка наличия ссылки. это проверка наличия такого текста ВООБЩЕ, то есть это может быть и не ссылка. это не 100% ый результат

    • и тут вы тоже правы 🙂
      но если спамер будет переделывать страницу, то вряд ли он оставит даже такой текст.

      Вообще тут много вопросов. Например, что делать если ссылка не прямая?
      site.domen/?goto=http://www.simplecoding.org
      Или ссылка реализована javascript'oм?

  • у них по моему каждый день новые идеи))))

  • у них по моему каждый день новые идеи))))

  • Pingback: Скрипт автоматической проверки обратных ссылок. » Блог Простого Программиста()

  • BM

    ХМ… очень интересная статья. Я создал давно уже год назад службу онлайн-блогов, вот много для себя интересного узнал. В скором времени сделаю систему трек-бэков, естественно с Captha + опциями проверки. Трек бек наверняка будет разрешен только пользователем с определённым уровнем «развития» на сайте. А не только что зарегистрировавшемуся 🙂 Спасибо за статью.

    С уважением BM.

    • Трек бек наверняка будет разрешен только пользователем с определённым уровнем “развития” на сайте.

      Я так понял, это для внутренних трекбеков. А что будет если, например, я поставлю ссылку на один из блогов вашей сети. На меня ссылка в комментариях того блога появится?

      • BM

        Это как раз имется ввиду ссылки на иные блоги, а не внутри сайта. Внутри сайте трек бек никакого смысла вообще вроде не имеет.

        Вообще наверное проще дать возможность «конфигурировать» это дело пользователю самостоятельно.

        Я блогерствую и сам, но не настолько. Так задолбали все эти кривые сервисы увешанные рекламой, что создал свой без рекламы на свои деньги. Ну делать мне нечего )) А вообще сайт живет засчет спонсоров, просто дающих мне деньги. Ибо им сайт нравиться. Что-то я не о том. Так вот на момент начинания мной службы дневников (июнь 2007) что такое track back толком никто и не знал в РуНете. Потому не задумывался и не очень то и осведомлён.

  • BM

    ХМ… очень интересная статья. Я создал давно уже год назад службу онлайн-блогов, вот много для себя интересного узнал. В скором времени сделаю систему трек-бэков, естественно с Captha + опциями проверки. Трек бек наверняка будет разрешен только пользователем с определённым уровнем «развития» на сайте. А не только что зарегистрировавшемуся 🙂 Спасибо за статью.

    С уважением BM.

    • Трек бек наверняка будет разрешен только пользователем с определённым уровнем “развития” на сайте.

      Я так понял, это для внутренних трекбеков. А что будет если, например, я поставлю ссылку на один из блогов вашей сети. На меня ссылка в комментариях того блога появится?

      • BM

        Это как раз имется ввиду ссылки на иные блоги, а не внутри сайта. Внутри сайте трек бек никакого смысла вообще вроде не имеет.

        Вообще наверное проще дать возможность «конфигурировать» это дело пользователю самостоятельно.

        Я блогерствую и сам, но не настолько. Так задолбали все эти кривые сервисы увешанные рекламой, что создал свой без рекламы на свои деньги. Ну делать мне нечего )) А вообще сайт живет засчет спонсоров, просто дающих мне деньги. Ибо им сайт нравиться. Что-то я не о том. Так вот на момент начинания мной службы дневников (июнь 2007) что такое track back толком никто и не знал в РуНете. Потому не задумывался и не очень то и осведомлён.

  • Привет еще раз.

    Сделал сервис даже по проверке ссылок, учел все пожелания и т.п. http://linkspy.info/

    Заметка в моем блоге по поводу этого сервиса. Буду рад, если ты его где-нибудь упомянешь и вообще будешь пользоваться 😉

    • Заметку прочитать не получается (404 Not Found).

      Поэтому задам вопрос здесь. Учитываются ссылки которые находятся в или нет?

      Я проверял страницу http://maulnet.ru/archives/777 (ссылка в комментариях на месте). Система ее не нашла.

  • Привет еще раз.

    Сделал сервис даже по проверке ссылок, учел все пожелания и т.п. http://linkspy.info/

    Заметка в моем блоге по поводу этого сервиса. Буду рад, если ты его где-нибудь упомянешь и вообще будешь пользоваться 😉

    • Заметку прочитать не получается (404 Not Found).

      Поэтому задам вопрос здесь. Учитываются ссылки которые находятся в или нет?

      Я проверял страницу http://maulnet.ru/archives/777 (ссылка в комментариях на месте). Система ее не нашла.

  • Как принято отправлять трекбеки в блогах?
    Я часто встречаю ссылку Trackback URI, нажимая на которую идет редирект обратно на страцицу. При этом какой-то скрипт выполняется?
    Или трекбеки отправляются, к примеру, из админки своего блога?

    • Вам не нужно нажимать на эту ссылку.
      Если вы используете движок вроде WordPress (не обязательно его), то работа с трекбеками выполняется полностью автоматически.
      Т.е. вы размещаете ссылку на другой блог и движок сам отправляет трекбек. При этом он сам находит ссылку трекбека (та, на которую вы нажимали).
      Если хотите написать собственный скрипт для отправки трекбеков, то вам сюда

      • Да, я собрался писать блог на собственном движке (исп. CI). Если честно, я не совсем понял, как движок автоматически находит ссылку Trackback URI и по какому принципу формируется […] *текст* […], но думаю что ответ найду в исходниках WordPress

        • Да, найдете 🙂
          Кстати, посмотрите исходный код страницы. Поищите:
          rdf:RDF …

  • Как принято отправлять трекбеки в блогах?
    Я часто встречаю ссылку Trackback URI, нажимая на которую идет редирект обратно на страцицу. При этом какой-то скрипт выполняется?
    Или трекбеки отправляются, к примеру, из админки своего блога?

    • Вам не нужно нажимать на эту ссылку.
      Если вы используете движок вроде WordPress (не обязательно его), то работа с трекбеками выполняется полностью автоматически.
      Т.е. вы размещаете ссылку на другой блог и движок сам отправляет трекбек. При этом он сам находит ссылку трекбека (та, на которую вы нажимали).
      Если хотите написать собственный скрипт для отправки трекбеков, то вам сюда

      • Да, я собрался писать блог на собственном движке (исп. CI). Если честно, я не совсем понял, как движок автоматически находит ссылку Trackback URI и по какому принципу формируется […] *текст* […], но думаю что ответ найду в исходниках WordPress

        • Да, найдете 🙂
          Кстати, посмотрите исходный код страницы. Поищите:
          rdf:RDF …

  • smale

    Здравствуйте
    Надеюсь, тут еще кто-то отвечает ? 🙂
    У меня такой вот вопрос.
    Вот предположим. Мне понравилась данная статья.
    Я пишу у себя пост . В нем делаю ссылку на эту статью
    Указываю адрес вашего трекбека. Одним словом, мой пост появится в ваших комментах. НО. А если этот пост ОЧЕНЬ большой? Знаком на 5000 ? Есть ли выход, кроме пишите коротко))

    • В трекбеке будет только несколько предложений. Можете поэкспериментировать 😉

  • smale

    Здравствуйте
    Надеюсь, тут еще кто-то отвечает ? 🙂
    У меня такой вот вопрос.
    Вот предположим. Мне понравилась данная статья.
    Я пишу у себя пост . В нем делаю ссылку на эту статью
    Указываю адрес вашего трекбека. Одним словом, мой пост появится в ваших комментах. НО. А если этот пост ОЧЕНЬ большой? Знаком на 5000 ? Есть ли выход, кроме пишите коротко))

    • В трекбеке будет только несколько предложений. Можете поэкспериментировать 😉

  • Вопрос к автору сайта, а вот у вас время у каждой статьи и в комментах пишется… Это какое? Московское? Заранее спасибочки за ответ.

  • Вопрос к автору сайта, а вот у вас время у каждой статьи и в комментах пишется… Это какое? Московское? Заранее спасибочки за ответ.

  • Pingback: Велосипедные фонари » Blog Archive » Фонари из китая2()

  • Pingback: Китайские телефоны в Алчевске | Китайские телефоны в Алчевске()