/* 21.04.2006 */
Прячем email-адреса от спам-роботов
Крошка сын к отцу пришел, и спросила кроха: "Спаммер - это хорошо, или спаммер - плохо?". Думаю, что даже маленькие дети в "продвинутых" семьях слышали о спаме, который является результатом непосильного труда тружеников невидимого фронта. Сегодня я вам расскажу, как можно прятать email-адреса на страницах сайта от spam-роботов, безустанно шныряющих по сети в поисках новых электронных адресов.
Кто не спрятался, спаммер не виноват!
Спам, как вы наверняка знаете, является большой головной болью всей глобальной сети. Спам-роботы сканируют сеть и выдирают со страниц сайтов email-ы. Спаммеры радуются растущей базе адресов и зарабатывают деньги. Пользователи бояться оставлять свои адреса в форумах, гостевых ... Админы нервно настраивают спам-фильтры. Короче говоря, все при деле. Однако, такое положение вещей кроме спаммеров не устраивает никого. Что мы, как разработчики можем сделать в свою очередь, чтобы помешать этому безобразию? Мы можем представлять email-адреса в виде непонятном для спам-роботов.
Прячем адрес
Спам робот, это программа, которая ищет на страницах определенную последовательность символов (и в этом её слабость), похожую на email. Конечно, спам-роботы не совсем "тупы" и обладают определенным интеллектом, что позволяет обходить некоторые виды защиты. Например, робот вполне может распознать в строке:
<a href="mailto:myname@my site.com"> мой 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>@</span>mysite.com</noscript>
В случае когда javascript доступен, пользователь увидит нормальную ссылку на email, в противном случае будет отображен email-адрес в виде простого текста (а не ссылки).
Т.е. пользователь в нашем примере увидит: myname@mysite.com
Другие подходы
Конечно же, Javascript не единственный островок антиспамового сопротивления на web-страницах, есть множество других подходов:
- простое размещение картинки (возможно с искажениями против OCR);
- простой текст в котором символ "@" заменен на [at], [dog] ... , или разделение символов адреса пробелами: m y n a m e @ m y s i t e . c o m, или подобные операции;
- преобразование в строку, содержащую цифровые ссылки-мнемоники на символы, где символы заменены на конструкции &#N, где N - это кодовая позиция символа в символьном наборе документа. При этом браузеру все равно как вы пишите, т.е., для браузера @ и @ совершенно одно и то же;
- представление e-mail в ссылкой вида http://mysite.com/getemail.php?d=mysite.com&u=pupkin, при клике на которую запрашивается скрипт на сервере, который возвращает HTTP-заголовок Location: mailto: myname@mysite.com;
- использование CSS стилей (
<style type="text/css">A.email:active { background-image: url('mailto:myname@mysite.com');}</style> <a href="javascript:void(0)" class="email">Пишите письма</a>
) .
Однако все же я остановился на javascript и вот почему:
- отображение картинок может быть отключено, а так же e-mail в картинке нельзя просто скопировать со страницы как обычный текст, это создает вероятность ошибки в набранном пользователем адресе;
- если e-mail представлен как обычный текст, но искажен, то неопытные пользователи могут не сообразить, что адрес нужно подправить;
- адрес в виде строки мнемоник продвинутые-роботы могут декодировать;
- ссылки на серверные скрипты отдающие HTTP-заголовок Location: я не вижу особых проблем с анализом HTTP заголовка Location у spam-роботов (по крайней мере, это намного проще чем интерпретировать код Javascript);
- CSS: не во всех браузерах работает (Opera, например, не понимает этот ход конем) , да и проанализировать CSS на наличие e-mail адреса, тоже не проблема.