/* 21.04.2006 */

Прячем email-адреса от спам-роботов

Автор: Цыгырлаш Игорь (21.04.2006)

Крошка сын к отцу пришел, и спросила кроха: "Спаммер - это хорошо, или спаммер - плохо?". Думаю, что даже маленькие дети в "продвинутых" семьях слышали о спаме, который является результатом непосильного труда тружеников невидимого фронта. Сегодня я вам расскажу, как можно прятать email-адреса на страницах сайта от spam-роботов, безустанно шныряющих по сети в поисках новых электронных адресов.

Кто не спрятался, спаммер не виноват!

Спам, как вы наверняка знаете, является большой головной болью всей глобальной сети. Спам-роботы сканируют сеть и выдирают со страниц сайтов email-ы. Спаммеры радуются растущей базе адресов и зарабатывают деньги. Пользователи бояться оставлять свои адреса в форумах, гостевых ... Админы нервно настраивают спам-фильтры. Короче говоря, все при деле. Однако, такое положение вещей кроме спаммеров не устраивает никого. Что мы, как разработчики можем сделать в свою очередь, чтобы помешать этому безобразию? Мы можем представлять email-адреса в виде непонятном для спам-роботов.

Прячем адрес

Спам робот, это программа, которая ищет на страницах определенную последовательность символов (и в этом её слабость), похожую на email. Конечно, спам-роботы не совсем "тупы" и обладают определенным интеллектом, что позволяет обходить некоторые виды защиты. Например, робот вполне может распознать в строке:

<a href="mailto:&#109;&#121;&#110;&#97;&#109;&#101;&#64;&#109;&#121;
&#115;&#105;&#116;&#101;&#46;&#99;&#111;&#109;"> мой email </A>"

ссылки-мнемоники на символы и декодировать их в "myname@mysite.com". Но все же роботам ещё далеко до совершенства, и в частности, им пока не по зубам интерпретировать javascript-код, чем мы и воспользуемся. Напишем javascript-функцию, которая бедет печатать на странице email-адрес. Так как робот не может выполнить функцию, то и не может получить результат её выполнения - email.

String.prototype.printAddr = 
function (_hamper,_prefix,_postfix,_face)
{
  _hamper=
  _prefix+
  "@"+
  this+
  (_postfix || '')
  document.write((_face||_hamper).link("mailto:"+_hamper));
}

Лучше сохранить эту функцию в отдельном файле (например, hide_email.js) и вызывать на нужных страницах следующим образом:

<html>
<head>
  <script type="text/javascript" src="hide_email.js"></script>
</head>
<body>
  Связаться со мной вы можете по адресу: 
  <script>"mysite".printAddr('любая абра-катабра', 'myname', '.com');</script>
</body>
</html>

В результате пользователь увидит следующее:

Связаться со мной вы можете по адресу:

Ещё примеры (прячем адрес: myname@mysite.com):

<script>"mysite.c".printAddr('abc', 'myname', 'om');</script>

Если вы хотите чтобы в качестве текста ссылки отображался не сам email, а произвольный текст или картинка, то их следует передать четвертым параметром:

<script>"mysi".printAddr('xyz', 'myname','te.com', 'Пишите');
<script>"mysi".printAddr('xyz', 'myname','te.com', '<img src="image.gif" />');</script>

В результате пользователь увидит:

Ложка дегтя

Данный способ на сегодняшний день весьма эффективен, однако есть один нюанс: пользователь может отключить Javascript, или браузер может его не поддерживать. Что же делать? Тут на помощь приходит тэг <noscript>...</noscript>, который отображает свое содержимое в случае, если javascript недоступен. Остается определиться с тем, что же показывать пользователю в контейнере noscript? Можно показать картинку с адресом, можно ссылку на страницу с объяснениями и инструкциями, что делать дальше и т.п. Я же предлагаю следующий вариант:

<noscript>myn</noscript><script>"mysi".printAddr('abc', 'myname', 'te.com');</script><noscript>ame<!--blablabla--><span>&#64;</span>mysite.com</noscript>

В случае когда javascript доступен, пользователь увидит нормальную ссылку на email, в противном случае будет отображен email-адрес в виде простого текста (а не ссылки).

Т.е. пользователь в нашем примере увидит: myname@mysite.com

Другие подходы

Конечно же, Javascript не единственный островок антиспамового сопротивления на web-страницах, есть множество других подходов:

Однако все же я остановился на javascript и вот почему:

-> Обсудить статью в форуме
<- Назад к списку статей
•> PNG-прозрачность в IE 5.5-6
<• Ссылки на символы в HTML4