Лучший способ запутать адрес электронной почты на сайте? - PullRequest
125 голосов
/ 14 апреля 2009

Я провел последние несколько дней, работая над обновлением своего личного сайта. URL моего личного веб-сайта (мое имя). (Моя фамилия) .com, поскольку моя фамилия довольно необычна, и мне посчастливилось подобрать доменное имя. Мой адрес электронной почты (мое имя) @ (моя фамилия) .com. Так что на самом деле, когда дело доходит до угадывания, это не очень сложно.

В любом случае, я хочу добавить ссылку mailto: на мой сайт, чтобы люди могли связаться со мной. И, несмотря на то, что мой адрес электронной почты не очень сложно угадать, я бы предпочел, чтобы его не собирали спам-боты, которые просто сканируют веб-сайты по шаблонам адресов электронной почты и добавляют их в свою базу данных.

Как мне лучше запутать свой адрес электронной почты, желательно в виде ссылки? Методы, которые я знаю:

<a href="mailto:x@y.com">e-mail me</a>

Это работает, но это также означает, что как только мой веб-сайт перейдет на Google, я перейду к спаму, поскольку спам-боты легко узнают мой адрес электронной почты.

<img src="images/e-mail.png" />

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

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

Ответы [ 26 ]

6 голосов
/ 14 апреля 2009

Я использую обфускацию JavaScript, посмотрите на это, например:

http://www.jottings.com/obfuscator/

6 голосов
/ 15 апреля 2009

Один веб-сайт, который я поддерживаю, использует несколько упрощенные средства JavaScript (надеюсь) не допускать спам-ботов.

Ссылки электронной почты вызывают функцию JS:

function sendEmail(name, domain) {
    location.href = 'mailto:' + name + '@' + domain;
}

Чтобы убедиться, что только пользователи, у которых включен JS, могут видеть ссылку, запишите их так:

function writeEmailLink(realName, name, domain) {
    document.write('<a href="javascript:sendEmail(\''
      + name + '\', \'' + domain + '\')">');
    document.write(realName);
    document.write('</a>');
}   

Использование одной функции JS для записи ссылки, которая вызывает другую, означает, что существует два уровня защиты.

4 голосов
/ 22 февраля 2013

Как сказано выше, я также использую обфускацию JavaScript с сайта jottings .

Веб-страница генерирует некоторый JavaScript, который можно улучшить. Текстовая строка mailto: находится в открытом доступе и может быть идентифицирована роботами (которые могли бы определить и отменить эту строку), но если кто-то входит на веб-страницу jottings.com, адрес электронной почты в форме mailto:addr@site.tld вместо addr@site.tld и затем удаляет текст mailto: из сгенерированного JavaScript, неожиданно появляется некоторый JavaScript, который не выглядит так, как будто он вообще имеет какое-либо отношение к электронной почте, - просто случайный JavaScript, который заполнен сетью. Можно еще улучшить это, избавившись от текста ссылки - я заменил свой на изображение моего адреса электронной почты, которое написано довольно неясным шрифтом. Затем, на случай, если этот метод на jottings.com станет популярным, я произвел рандомизацию имен переменных в выходном JavaScript, чтобы роботу было трудно обнаружить экземпляр сгенерированного jottings кода JavaScript.

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

Пример может сделать это немного более понятным. Я использовал Обфускатор Jottings по ссылке выше, чтобы скрыть mailto:foo@bar.com (обратите внимание, что я изменяю первоначальному замыслу веб-сайта jottings, введя строку mailto:foo@bar.com вместо foo@bar.com) с текстом «Send Me Email», который jottings превратился в этот Javascript:

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption key feature by Andrew Moulden, Site Engineering Ltd
// This code is freeware provided these four comment lines remain intact
// A wizard to generate this code is at http://www.jottings.com/obfuscator/
{ coded = "3A1OTJ:rJJ@VAK.GJ3"
  key = "J0K94NR2SXLupIGqVwt8EZlhznemfaPjs7QvTB6iOyWYo3rAk5FHMdxCg1cDbU"
  shift=coded.length
  link=""
  for (i=0; i<coded.length; i++) {
    if (key.indexOf(coded.charAt(i))==-1) {
      ltr = coded.charAt(i)
      link += (ltr)
    }
    else { 
      ltr = (key.indexOf(coded.charAt(i))-shift+key.length) % key.length
      link += (key.charAt(ltr))
    }
  }
document.write("<a href='mailto:"+link+"'>Send Me Email</a>")
}
//-->
</script><noscript>Sorry, you need Javascript on to email me.</noscript>

После того, как я вернул это, я вставил его в редактор и:

  1. удалить mailto:
  2. заменить текст ссылки указателем на изображение моего адреса электронной почты
  3. переименовать все переменные
  4. заменить раздел "noscript" другой ссылкой на адрес электронной почты. Image

Я получаю это:

<script type="text/javascript" language="javascript">
<!--
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption kkeoy feature by Andrew Moulden, Site Engineering Ltd
// This kudzu is freeware provided these four comment lines remain intact
// A wizard to generate this kudzu is at http://www.jottings.com/obfuscator/
{ kudzu = "3A1OTJ:rJJ@VAK.GJ3"
  kkeoy = "J0K94NR2SXLupIGqVwt8EZlhznemfaPjs7QvTB6iOyWYo3rAk5FHMdxCg1cDbU"
  shift=kudzu.length
  klonk=""
  for (variter=0; variter<kudzu.length; variter++) {
    if (kkeoy.indexOf(kudzu.charAt(variter))==-1) {
      lutu = kudzu.charAt(variter)
      klonk += (lutu)
    }
    else {
      lutu = (kkeoy.indexOf(kudzu.charAt(variter))-shift+kkeoy.length) % kkeoy.length
      klonk += (kkeoy.charAt(lutu))
    }
  }
document.write("<a href='"+klonk+"'><img src='contactaddressimage.png' alt='Send Me Email' border='0' height='62' width='240'></a>")
}
//-->
</script>
<noscript>
    <img src="contactaddressimage.png" border="0" height="62" width="240">
    <font face="Arial" size="3"><br>&nbsp;</font></p>
</noscript>
3 голосов
/ 15 апреля 2009

Не знаю, насколько хорошо это будет работать. Не могли бы вы оставить свой адрес электронной почты и загрузить его с помощью AJAX-вызова после завершения загрузки страницы. Не уверен, что спам-боты могут подцепить измененный HTML-код или они достаточно умны, чтобы прослушивать другой HTTP-трафик, чтобы попытаться выбрать адреса электронной почты, или они просто сканируют страницу, как она получена в первый раз.

2 голосов
/ 03 августа 2010

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

Его три лучших способа были:

  1. Изменение направления кода с помощью CSS
  2. Использование отображения CSS: нет
  3. ROT13 Шифрование

Предостережение - это было опубликовано два года назад. Спам-боты, возможно, стали умнее.

1 голос
/ 28 января 2016

Другим подходом может быть использование инфраструктуры JavaScript и привязка данных / модели к элементам HTML. В случае AngularJS элементы HTML будут записаны как:

<a href="mailto:{{contactEmail}}"><span>{{contactEmail}}</span></a>

В привязке интерполяции {{data}} используется переменная области действия, которая содержит фактическое значение электронной почты. Кроме того, можно также использовать фильтр, который обрабатывает декодирование электронной почты следующим образом:

<a href="mailto:{{contactEmail | decode}}"><span>{{contactEmail | decode}}</span></a>

Преимущества в том, как написан HTML. Недостатком является то, что он требует поддержки сценариев, для некоторых из которых может быть нет нет.

просто другой подход.

1 голос
/ 11 сентября 2017

Решение для вызова Ajax

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

HTML

<a class="obfmail" href="#" rel="info">click here to show email address</a>

или

<a class="obfmail" href="#" rel="info">
    <img src="img/click-to-show-email.jpg">
</a>

JQuery

$(document).one'click', '.obfmail', function(e) {
    e.preventDefault();
    a = $(this);
    addr = a.attr('rel');
    $.ajax({
        data: { 
            email: addr
        },
        url : "/a/getemail",
        type: "POST",
        dataType: 'json',
        success: function(data) {
            a.html(data.addr);
            a.attr('href', 'mailto:' + data.addr);
        }
    });
});

PHP

if($_POST['email']) {
    ...
    return json_encode(array(
        code     => '200',
        response => 'success',
        addr     => 'info@domain.ltd'
    ));
}

Для большей безопасности вы можете изменить .on на .one следующим образом $(document).one('click', '.obfmail', function(e) { или даже работать с сгенерированным токеном PHP, который вы передаете в данные при вызове ajax, чтобы принять только один вызов функции ajax, подобной этой :

html: <a class="obfmail" href="#" rel="info" token="w3487ghdr6rc">

JQuery:

...
addr = a.attr('rel');
tkn  = a.attr('token');
$.ajax({
    data: { 
        email: addr,
        token: tkn
    }, ...

.

Можно также закодировать возвращенный адрес электронной почты или инвертировать его.

.

Хорошо работает и для телефонных номеров!

0 голосов
/ 10 сентября 2015
<!-- Multi-Email Obfuscator  -->
<!-- step 1: &#064; = @  -->
<!-- step 2: a scrap element  -->
<!-- step 3: ROT13 encode for .com  -->
info<!-- step 1 -->&#064;<!-- step 2 --><b style="display:none">my</b>domain<!-- step 3 --><script>document.write(".pbz".replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));</script>
0 голосов
/ 24 мая 2014

Если кто-то использует Rails, он может использовать гем actionview-encoded_mail_to. (https://github.com/reed/actionview-encoded_mail_to)

Есть несколько вариантов:

: кодировать - этот ключ будет принимать строки "javascript" или "hex". Передача "JavaScript" будет динамически создавать и кодировать почту ссылка затем перевести его в DOM страницы. Этот метод не покажет ссылка на странице, если у пользователя отключен JavaScript. Переходя «hex» закодирует адрес электронной почты перед выводом mailto ссылка на сайт.

: replace_at - если имя ссылки не указано, адрес электронной почты используется для ярлыка ссылки. Вы можете использовать эту опцию для запутать адрес электронной почты, заменив знак @ строкой дано как значение.

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

0 голосов
/ 26 ноября 2010

Я использую PHP-функцию , чтобы сгенерировать некоторый JavaScript для вывода электронной почты при загрузке страницы. Обратите внимание, что вам не нужен PHP для генерации JS во время выполнения, вы можете сгенерировать JS один раз локально, а затем включить статический JS на своей странице.

Вы также можете использовать связанную функцию с этим фрагментом ниже, чтобы автоматически запутывать адреса электронной почты в некотором заданном HTML (где $ processingContent - это HTML):

 $emailMatches = array();
 $matchCount = preg_match_all('/(?:[a-zA-Z0-9_\.\-])+\@(?:(?:[a-zA-Z0-9\-])+\.)+(?:[a-zA-Z0-9]{2,4})+/', $processedContent, $emailMatches);

 if($matchCount > 0) {
    $emailMatches = $emailMatches[0];

    foreach($emailMatches as $email) {
    $replacement = createJSMailLink($email);

    $processedContent = str_replace($email, createJSMailLink($email), $processedContent);
 }
...