Защита e-mail от спамботов.

    Часто пользователи удивляются, откуда спаммеры узнают их e-mail адреса и выливают на них тонны спама. Оставляя за рамками этой статьи такие способы пополнения спаммерских базы, как вирусы, «слив» адресов владельцами почтового сервера или прослушивание HTTP и ICQ траффика, рассмотрим самый распространенный случай.
    Одним из основных источников новых e-mail адресов являются собственно веб-страницы, на которых беспечные пользователи (а порой и владельцы сайта) открыто публикуют свой e-mail, откуда спамботы (сборщики e-mail) без проблем его извлекают и используют в своих нехороших целях.

    Далее будут рассмотрены основные приемы шифрования e-mail адресов от спамботов, а также приведены результаты замера эффективности каждого из приемов, путем практического использования каждого способа для свежезарегистрированных e-mail адресов и оценки количества спама.

    В настоящее время публикуемые на страницах e-mail адреса принято защищать следующими основными способами:

    1. Защита написанием e-mail на картинке (либо отдельных букв, символов @ и точки).


    Достоинства: относительная легкость автоматизации, трудоемкость распознавания роботами (современные спамботы берут количеством, а не качеством, и заниматься OCR им просто не выгодно — лучше на соседнем сайте собрать десяток открытых e-mail).
    Недостатки: пользователи с отключенными картинками не смогут увидеть e-mail, а пользователи со включенными картинками не смогут его скопировать. Кроме того, сложности с подгонкой шрифтов/размеров текста на картинке к остальному тексту.
    Эффективность: высокая. Опубликованный таким способом e-mail адрес на одном популярном сайте так и остался «нераспечатанным» спамерами.
    Добавлено: спасибо gudoshi за предоставленные примеры автоматизации этого способа:
    mail2pic.org
    www.mailonpix.ru

    2. Защита при помощи кодирования e-mail адресов в мнемоники (entitles-символы).


    Пример:

    adress@mail.ru

    Достоинства: легкость автоматизации, независимость от таких параметров, как включенная графика или JS у пользователя.
    Недостатки: легкость расшифровки, обход некоторыми современными спамботами.
    Эффективность: низкая. Опубликованный таким образом ящик получает около 10-ти писем в день, (очевидно, что некоторые роботы «сломали зубы» о такой способ, т.к. на опубликованный открыто ящик приходит в несколько раз больше писем).

    3. Защита при помощи кодирования через JavaScript, с (или без) вынесением частей кода во внешний файл.


    Пример:


    Более корректно использовать возможности DOM вместо document.write, этот пример приведен лишь в качестве иллюстрации.

    Достоинства: относительная легкость автоматизации, трудность распознавания роботами. Опубликованный таким образом адрес без проблем кликается и копируется, а также отображается людям с отключенной графикой.
    Недостатки: способ не работает у пользователей с отключенным (по разным причинам) JavaScript (да, такие пользователи есть, и в определенных случаях нужно учитывать и их интересы). Автор был очень удивлен, когда клиент заявил, что не видит на странице контактов e-mail адреса.
    Эффективность: высокая. На тестовый адрес спам-писем не пришло.
    Добавлено: спасибо alkaruno за ссылку на сервис автоматической генерации простенькой JS-обертки для e-mail.
    Пример от ecl, который можно усложнять до бесконечности:
    send email

    В этом примере при клике мышкой фейковый адрес заменяется яваскриптом на реальный.

    4. Защита с использованием CSS, комментариев и способа 2.


    В раздел помещаем примерно такой css (названия классов и содержимое можно и нужно изменять):
    Можно вынести это и во внешний файл, будет даже надежнее, однако в случае неподгрузки CSS адрес будет отображаться неверно.

    Далее, в коде страницы в местах, где надо вставить e-mail, используем примерно такое:
    a!#N#!dress&#64mail&#46;<![if !IE]>r<![endif]>u

    Пояснения: домен почтового сервера необходимо обязательно «разделять», чтобы не привлекать внимание полуавтоматических сборщиков e-mail. Использовать display:none для «лишних» символов необходимо для снижения эффективности возможных strip_tags функций. Во всех возможных «скрытых» местах (и даже именах CSS-классов) лучше использовать случайные (random) последовательности символов, что затруднит их автоматический парсинг.

    Способ работает во всех браузерах, независимо от включенности графики и JavaScript.
    Недостаток: в некоторых браузерах адрес придется набрать вручную, поскольку скопируется только первая буква (вопрос как побороть это пока не решен). Если это важно, можно комбинировать этот способ с предыдущим, поместив все это в 
    Добавлено: mcm69 предложил использовать яваскрипт для правильной работы Ctrl+C на таких текстах.
    Эффективность: высокая. Спам-писем не пришло.

    5. Построение текста при помощи CSS


    Этот очень интересный способ показал Alinaki
    Для построения e-mail адресов используется CSS-шрифт (буквы составляются из маленьких div-квадратиков).
    Достоинства очевидны.
    Недостатки: не копируется, не отображается в случае неподгруженного CSS (выносить в около 10 кб CSS накладно). Кроме того, некоторые символы такого шрифта не совсем разборчивы.

    За рамками статьи остались рассмотрение таких способов, как использование форм для отправки почты с капчей (это не всегда возможно — к примеру на форуме, где неосторожный пользователь опубликовал свой e-mail), или отображения e-mail адреса при помощи Flash.

    Добавлено: любой из этих способов можно совместить с необходимостью регистрации на сайте (отображать e-mail адреса только зарегистрированным (влогиненым) пользователям, а незарегистрированным — не отображать вообще (с просьбой зарегистрироваться) либо отображать самым суровым способом). Соответствующее преобразование e-mail для незарегистрированных ботов пользователей можно произвести несложными регулярками.

    Надеюсь, что статья сподвигнет web-мастеров оснастить защитой все те места, в которых беспечные пользователи так или иначе могут оставить свой e-mail (форумы, профили, камменты, и т.п.).

    В данном исследовании не рассмотрены серверные способы борьбы со сборщиками e-mail (например, бан по IP), это можно считать темой следующего материала.

    Материалы по теме:
    Прячем email-адреса от спам-роботов (рассматриваются некоторые несложные способы).
    Защита от ботов средствами PHP и JavaScript (статья от Cord). На практике рассматривается шифрование при помощи нанесения на картинку и при помощи JS.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 79

      0
      перенеси - сюда
        0
        перенес в Web-разработку.
      • UFO just landed and posted this here
          0
          спасибо, исправил. поместить, конечно же, в <noscript></noscript>.
          0
          Я бы объединил последний способ с переопределением яваскриптом Ctrl+C, чтобы нормально копировать адрес.
            0
            простите, не очень понятно про переопределение, может поясните примером?
            кстати, копировать можно не только через Ctrl+C :)
              +1
              Ну, я точно не помню, как это делается сырым JS, но в плагинизированном jQuery это делается довольно просто, вот, даже демо плагина весьма впечатляет)
            +2
            да уж,дальше первого способа мои кривые ручки видимо не уйдут:)
              0
              самокритика - это хорошо, но не нужно себя так недооценивать:)))
                0
                Джеси,я ж в этом совсем ничё не понимаю,куда уж оценивать-то!:)
                0
                По-моему сложнее генерировать картинку, ведь любой серверный язык может обрезать слова, а дальше мелкопорубленный e-mail вставляется в шаблон + один раз написав функцию вы ее тыкаете куда ваша душа пожелает :)
                  0
                  написать функцию (т.е. автоматизировать) можно любой из способов.
                  хотелось бы путем обсуждения выбрать лучший способ, а потом и функция будет.
                    0
                    если ещё и с картинками проблемы будут...тогда я вообще не знаю,что делать)))
                0
                3й способ, imho, не такой надежный:
                - у меня, к примеру, js включен только для проверенных сайтов (таких как habr),
                - не трудно написать парсер, правда скорей всего он должен быть заточен под конкретный сервис.
                  0
                  картинки тоже не очень трудно распознавать, но пока в инете больше половины сайтов публикуют e-mail адреса в открытом виде без каких либо ухищрений, спамеры вряд ли будут писать хитрые парсеры понимающие js и css.
                  +2
                  а вот еще, imho, простой способ обезопаситься. к примеру вот адрес: sobaka_takaya@mail.ru, записывать его таким образом "Пишите мне на mail.ru пользователю sobaka_takaya", т.е. исключить прямую ссылку mailto, т.к. обычно боты парсят, конструкцию перед именем сервера.
                    +4
                    Человеку так воспринимать тоже сложнее.
                    0
                    Еще неплохо, на мой взгляд, сделано на groups.google.com: вместо адреса показывается a...@mail.ru, ... — ссылка на форму с капчей, после ввода которой адрес становится виден.
                      0
                      Вот тут
                      и тут неплохие ресурсы для реализации защиты адреса по 1 способу)))...сам пользуюсь, так как другие,мне пока не по плечу.
                        +2
                        Сервис http://www.mailonpix.ru — некачественный. С отключённым js получить картинку не удастся т.к. ссылка "cделать картинку" представляет из себя такой, бракованый, url: http://www.mailonpix.ru/#
                          0
                          )))JS не отключаю,потому и не знал про неудачу с генерацией,а вот по поводу ссылки согласен...при размещении в блоге клик по картинке отправляет на сайт изготовитель картинки...с предложением сделать себе такую же)))у мылопикча этот момент реализован грамотнее.
                            0
                            Ну это ни разу не проблема. Можно сохранить себе картинку на диск и вставлять по мере необходимости.
                          0
                          чисто внешне - mailonpix.ru создает более приятную картинку, чем mail2pic.org, имхо.
                            0
                            упс, не сразу заметил конструктор по оформлению пикчи)
                            з.ы. спасибо за ссылки на сервисы)
                            0
                            Почему никто не задумался над тем, что это могут быть элементарные мылосборники?
                              +2
                              если над всем этим задумываться,придет злая тетя паранойя.)"Вы задумались?тогда мы идем к вам..."
                            0
                            привык заменять адрес на adress(собака)mail.ru или adress(at)mail.ru

                            кому надо те понимают...
                              0
                              парсится на ура
                              хоть я иногда и нахожу новые интересные замены, но почти все они эмпирически (и автоматически, что важно) легко вычленяются
                              ЗЫ: я не спамер ;) опыт от написания антиспам скрипта
                                0
                                вместо "собака" я пишу "такса" "собачечка" "дог" и т. д. и можно писать по разному иногда пишу pochta[такса]mail.ru иногда pochta(такса)mail.ru
                                неужели все эти написания бот тоже может учесть?, ведь их можно придумать бесконечное количество.
                                  0
                                  бесконечное количество не учтет, но варианты типа а) username(что-угодно)mail.domain и б) username[что-угодно]mail.domain чересчур стандартны, чтобы их не учесть :)
                              • UFO just landed and posted this here
                                  0
                                  "adress(at)mail.ru" - как впрочем и xxx[at]xxx.xx удобно описываются регуярными выражениями, которые играют ключевую роль в парсинге, поэтому скорее всего такая конструкция почти ни от чего не спасет.
                                  0
                                  Пользуюсь простейшем JS-кодированием, который легко получаю тут: http://tools.xplosio.ru/maillink

                                  Думаю, что в 99% случаев бот не распознает e-mail.
                                    –1
                                    на одном из моих сайтов применяется JS-кодирование, однако спам валит периодически. возможно, боты пронюхали про эти адреса как-то еще, но лучше перестраховаться. тем более, если бот на странице нашел значек @, он может позвать хозяина (полуавтоматические собиралки).
                                    я анализировал некоторые ТЗ на англоязычных фриланс-сайтах и форумах, поэтому утверждаю - яваскрипт парсится спам-сборщиками, а вот JS+CSS им не по зубам.
                                      +1

                                      <script type="text/javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%69%6e%66%6f%40%6d%61%69%6c%2e%72%75%22%3e%69%6e%66%6f%40%6d%61%69%6c%2e%72%75%3c%2f%61%3e%27%29%3b'))</script>


                                      где тут @?

                                      а если бот с JS движком, то он всегда может посмотреть и результат выполнения страницы. и тут уже ни css, ни js не поможет.
                                        +2
                                        боту js движок в таком варианте ненужен, он может просто декодировать эту строку, так же как и html entities, а там и собака зарыта.. :)
                                          0
                                          Декодировать сможет только заточенный на эту страницу бот. Спамеры же разводят ботов общего вида: с максимальным соотношением количества найденных ящиков к стоимости бота. Поэтому-то боты общего вида и пасуют перед необычными записями e-mail.
                                            0
                                            простите, но что в этой записи необычного?
                                            автор не первый так написал, и создатели ботов тоже не дураки и такие варианты предусматривают не в последнюю очередь, тем более что это просто url декодирование.

                                            можно, конечно, написать свой аналог кодирования на стороне сервера и декодирования на стороне клиента, через js. Вот тут не поспоришь, бота придется затачивать под определенную страницу.
                                          0
                                          насколько я знаю, такие выражения некоторыми антивирусами считаются "потенциально опасными"...
                                        0
                                        спасибо,возьму на заметку)))пригодится для поста
                                        0
                                        entities, а не entitles наверное
                                          +1
                                          К сожалению, всё вышеописанное вызывает лишь грусть.

                                          Борьба со спамом _ДОЛЖНА_ вестись на совсем другом уровне, нежели боязнь лишний раз сообщить где-нибудь свой email-адрес.

                                          Все эти неудобства вызваны лишь техническим несовершенством протокола SMTP, которое никто не хочет исправлять.

                                          Ну есть ведь возможности! Пусть даже путём ломки обратной совместимости, однако сделать почту, на которую не будет приходить спам возможно!
                                            0
                                            "Все эти неудобства вызваны лишь техническим несовершенством протокола SMTP, которое никто не хочет исправлять." :)))
                                            предложите решение , может кто и займется этим
                                              0
                                              Sender ID, SPF, DomainKeys...
                                              0
                                              > Борьба со спамом _ДОЛЖНА_ вестись на совсем другом уровне

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

                                              > Все эти неудобства вызваны лишь техническим несовершенством протокола SMTP

                                              Далеко не только им. Да, протокол SMTP плох, но сделать протокол с помощью которого не будут рассылать спам невозможно.

                                              Если возможность отправить сообщение есть у легального пользователя, значит такая же возможность есть и у спамера.

                                              Допустим придумали некий протокол Х в котором не должно быть спама, но который позволяет Васе отправлять сообщения 10 своим друзьям (адреса которых есть в адресной книге или в истории переписки).
                                              После того как Вася зашёл на порносайт браузером IE (потому что не знает вообще что такое браузер, а IE и интернет для него одно и тоже) js-эксплоит установил на его компе троян. Этот троян разослал по адресной книге Васи спам сообщения. Точно так же как это Вася сделал бы сам. Получатели этого спама никак не смогут отличить, что это сделал не Вася и его троян.

                                              Одних технических мер недостаточно. Нужны законы против спамеров, принятые в большинстве стран (инернет границ не имеет и законы в отдельно взятой стране мало помогут).
                                              +3
                                              Вспомнилась старая ссылка: Примите участие в коллективной атаке спаммерских баз email. Реальная возможность отомстить спаммерам!
                                              Единственное дополнение - запретите эту фейковую страничку через robots.txt - спамботы на него плюют, а поисковики уважают и не будут индексировать это.
                                                0
                                                На cssplay.co.uk есть специальный css-шрифт. Отличная штука :)
                                                  0
                                                  Еще забыли вариант с кучей фейковых емэйлов (скрытых от пользователей) с пингающимися доменами.
                                                  Не очень гуманно (можно сгенерировать и реальный адрес), но, надеюсь, удорожает некоторым работу.
                                                    0
                                                    этот вариант я привел в комментариях чуть выше, однако он не защищает реальные e-mail, жаль.
                                                      0
                                                      Согласен. Хотя толк может быть если будет использоваться повсеместно. А ля стратегическое решение - может быть когда-нибудь спамеру будет дешевле (вероятнее) случайно сгенерировать валидный емэйл, чем отыскать нефейковый.
                                                    +1
                                                    На gmail есть дополнительный способ избавиться от спама.

                                                    Допустим, у Вас есть ящик sendspamhere@gmail.com. И Вам просто необходимо оставить Ваш емейл, допустим в банке, куда они обещают Вам слать выписки. Так вот, оставляете им емейл такой: sendspamhere+bank@gmail.com
                                                    Почтовик на гугле настроен таким образом, что почта на все адреса вида логин+всечтоугодно@gmail.com приходит на логин@gmail.com

                                                    Если из банка адрес утекет к спамерам - ставите спам фильтр на адрес и имеете серьезный повод подвергнуть банк публичной обструкции.
                                                      0
                                                      Жаль, но это один из тех методов которые становятся неэффективными по мере их распространения.
                                                        0
                                                        У GMail есть одна фича действительно необычная фича — точки в имени отбрасываются, таким образом user.name, userna.me, us.ername и username это один и тот же адрес. А использование + это стандартная фича протокола. Просто о ней мало кто знает.
                                                          +1
                                                          Если почтовый сервер не поддерживает "+" в адресе, то это бракованный сервер, так же как и форма ввода адреса не понимающая плюсы некачественная.
                                                            0
                                                            Думаю, что гмайлу нетрудно удостоится отдельной строчки в коде спамботов, чтобы откидывать точку.
                                                          +1
                                                          посетила вот такая идея:

                                                          <a href=";" onclick="a='user@Xmail'; this.href='mailto:'+a.replace(/@X/g,'@');">send email</a>

                                                          Из этого получается, что в переменной a записан для робота вполне валидный адрес, который хорошо подходит под самую простую маску, то есть в случае перебора - он уйдет с "мыслью" об успешно выполненной задаче, и набьет свою базу мусорными адресами. Замена @X => @ примитивна, но мысль думаю ясна, дальше можно усложнять по желанию.
                                                            0
                                                            ЗЫ: Xmail.ru написал без .ru - так как фильтр хабра вне зависимости от применяемых тэгов делал из него mailto.
                                                              0
                                                              идея оригинальна!
                                                              увы, люди с отключенным JS отправят почту на несуществующий e-mail.
                                                                0
                                                                И скопировать адрес в буфер не получится.
                                                                  0
                                                                  там событие onclick, но можно написать просто document.write - разница не принципиальна.
                                                                +1
                                                                Всем спасибо за интересные ссылки и примеры, обновил топик, дополнив его ссылками.
                                                                Узнал много нового. На хабре очень приятно делиться своими знаниями и получать за это новые.
                                                                  0
                                                                  В Smarty есть штуковина {mailto} ссылка

                                                                  {mailto address="me@example.com" encode="javascript_charcode"}

                                                                  превращается в:

                                                                  <script type="text/javascript" language="javascript">
                                                                  <!--
                                                                  {document.write(String.fromCharCode(60,97, ... snipped ....60,47,97,62))}
                                                                  //-->
                                                                  </script>

                                                                  Мне кажется это довольно удобным, хотя сам ни когда не заморачивался над кодированием электронных адресов.
                                                                    0
                                                                    Я кодирую адреса (одной строкой):

                                                                    <a href="mailto:noreply@spammer.net"
                                                                    onmouseover="var a=String.fromCharCode(67+47,25+92,46+61,17+84,33+65,70+27);
                                                                    var b=String.fromCharCode(21+43,23+91,48+69,65+42,66+35,95+3,19+78,20+26,66+33,86+25,25+84);
                                                                    this.href=['mail','to:',a,b].join('');">rukeba</a>

                                                                    Как работает, можно посмотреть тут: http://rukeba.com/ra/2008/03/28/nautilus-pompilius-dyhanie/
                                                                    Есть templatetag для django, если кому интересно.
                                                                      0
                                                                      В свое время написал статью на эту тему.
                                                                      http://webscript.ru/stories/07/05/10/677…
                                                                        0
                                                                        есть еще способ с CSS стилями, переворачивающий строку.
                                                                          0
                                                                          поясните примером, пожалуйста?
                                                                            0
                                                                            используется возможность изменить направление текста с посмощью стилей. примерно так:
                                                                            [span style="direction: rtl;unicode-bidi: bidi-override;"]ur.tset@maps_on[/span]

                                                                            правда, не знаю, насколько такой способ от спамеров спасает
                                                                          0
                                                                          лучший способ - не публиковать e-mail вообще, см. Википедию.
                                                                            0
                                                                            куда именно смотреть?
                                                                            бывают случаи, когда не публиковать нельзя.
                                                                              0
                                                                              e-mail любому участнику можно отправить через пункт меню, не узнавая его e-mail
                                                                            0
                                                                            Я не селен в программировании, но родилась идея (может и бред?!)!
                                                                            Привелек первый способ, а почему бы не полностью менять email на картинку, а какуюто его часть(и) ? например символ "@" поменять на изображение собачки (или улитки)?! что-нибудь в таком духе!
                                                                              0
                                                                              Как такой метод? У меня он генерится случайным образом..


                                                                              <script language="JavaScript" type="text/javascript"><!--
                                                                              function oCtn(){var mm="@"; mm=mm+"doma"; mm="r"+mm; mm=mm+"in.net"; mm="use"+mm; return mm}; function jraIpwiKsJ(){return "?Subject=testing"}; function fIb0pAzr(){status="mailto:"+oCtn()+jraIpwiKsJ()}; function n7eNcRvVwOcBzOnM(){status=""}; function ium1ySnnyegntOsozM(){this.location="mailto:"+oCtn()+jraIpwiKsJ(); return false}; document.write("<a href='mailto:[antispam_protected]' onmouseover='fIb0pAzr()' onmouseleave='n7eNcRvVwOcBzOnM()' onclick='return ium1ySnnyegntOsozM()'>"+oCtn()+"<"+"/a>");
                                                                              //--></script><noscript>user®domain
                                                                                0
                                                                                Интересно, а все эти вспомогательные сервисы, которые email позволяют зашифровать, они сами emailов не собирают ли? :)
                                                                                  0
                                                                                  В первом способе у картинке можно проставить alt="@" и проблемы с копированием текста и с отключенными картинками снимется...
                                                                                    0
                                                                                    самый актуальный способ - это мэйл в картинке. можно юзать генераторы наподобие этого:
                                                                                    http://iframe.in/email-protector/
                                                                                    0
                                                                                    Я проводил несколько тестов. Регистрировал ящики на гугле, яндексе и мэйл-ру.
                                                                                    Часть не светил вообще нигде (не посылал никаких писем, не давал никому адрес), часть светил только среди 2-3 основных переписчиков, часть активно указывал в открытом доступе.
                                                                                    В результате на ВСЕ ящики постепенно начал идти спам. Все указанные службы этот спам успешно фильтровали. И, в конечном итоге, в папке Спам оказывались десятки/сотни писем в день/неделю, а во Входящих, за редчайшим исключением, только полезные письма.
                                                                                    Из чего я сделал вывод, что прятать адрес бесполезно. Можно спокойно его светить. Никакой практической разницы всё равно нет.
                                                                                      0
                                                                                      Gmail отсеевает спам очень прилично… Даже если Ваш мейл на личном домене, простая переадресация поможет.
                                                                                      Схема:
                                                                                      Мейл1 — мейл который указываете при регистрациях и т.д… Делаете на нем переадресацию на Мейл2
                                                                                      Мейл2 — ящик на Gmail на котором стоит форвард (переадресация) на Мейл3
                                                                                      Мейл3 — ящик который проверяете и с которым работаете.

                                                                                      Тоесть, в результате на Мейле3 получаете нормальные письма… Хотя изначально на Мейл1 Вам обычно валил страшным потоком спам.

                                                                                      Only users with full accounts can post comments. Log in, please.