Скрыть адрес электронной почты от ботов - сохранить mailto:


81

tl; dr

Скрыть адрес электронной почты от ботов без использования скриптов и сохранить mailto:функциональность. Метод также должен поддерживать программы чтения с экрана.


Резюме

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

  • Адрес электронной почты должен быть полностью видимым для зрителей и поддерживать mailto:функциональность

  • Адрес электронной почты не должен быть в виде изображения .

  • Электронный адрес должен быть «полностью» скрыт от спам-сканеров, спам-ботов и других сборщиков.


Желаемый эффект:

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

  • Адрес электронной почты либо отображается на странице, либо может быть легко отображен после какого-либо взаимодействия с пользователем, например открытия модального окна.

  • Пользователь может нажать на на адрес электронной почты , который , в свою очередь , повлечет за mailto:функциональность.

  • При щелчке по электронной почте откроется приложение электронной почты пользователя.

    Другими словами, mailto:функциональность должна работать.

  • Адрес электронной почты не отображается или не идентифицируется как адрес электронной почты для ботов (включая источник страницы)

  • У меня нет почтового ящика, полного спама


Что НЕ РАБОТАЕТ

  • Добавление контактной формы - или чего-то подобного - вместо адреса электронной почты

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

  • Замена адреса изображением адреса

    Это создает ОГРОМНЫЙ недостаток для тех, кто использует программу чтения с экрана ( пожалуйста, помните о слабовидящих в своих будущих проектах )

    Он также удаляет на mailto:функциональность , если вы не сделаете кликабельные изображения , а затем добавить mailto:функциональность как hrefдля связи, но что поражения цели и теперь электронная почта видны боты.


Что может сработать:

  • Умное использование pseudo-elementsinCSS

  • Решения, использующие base64кодирование

  • Разделение адреса электронной почты и распространение частей по документу, а затем их объединение в модальном окне, когда пользователь нажимает кнопку (это, вероятно, будет включать несколько CSSклассов и использование anchor tags)

  • Изменение htmlатрибутов черезCSS

    @MortezaAsadi изящно поднял эту возможность в комментариях ниже. Это ссылка на полную версию - Статья за 2012 год:

    Что, если бы мы могли использовать CSS для изменения атрибутов HTML?

  • Другие творческие решения, выходящие за рамки моих знаний.


Подобные вопросы / исправления

(Это отличное исправление, предложенное Джо Маллером, оно работает хорошо, но основано на сценариях . Вот как это выглядит;

<SCRIPT TYPE="text/javascript">

  emailE = 'emailserver.com'

  emailE = ('yourname' + '@' + emailE)

  document.write('<A href="mailto:' + emailE + '">' + emailE + '</a>')

</script>



<NOSCRIPT>

  Email address protected by JavaScript

</NOSCRIPT>

  • Ищете функцию обфускатора адресов электронной почты только на php

    (Умное решение, использующее оба PHPи CSSдля того, чтобы сначала отменить электронное письмо с помощью PHP, а затем отменить его с помощью CSS) Очень многообещающее решение, которое отлично работает! Но это слишком легко решить .

  • Стоит ли в наши дни скрывать адреса электронной почты в Интернете?

    (Исправление Javascript)

  • Лучший способ скрыть адрес электронной почты на веб-сайте?

    Выбранный ответ работает . Это действительно хорошо работает. Это включает в себя кодирование электронной почты как html entities. Можно ли это улучшить?

    Вот как это выглядит;

    <A HREF="mailto:
    
    &#121;&#111;&#117;&#114;&#110;&#097;&#109;&#101;&#064;&#100;&#111;&#109;&#097;&#105;&#110;&#046;&#099;&#111;&#109;">
    
    &#121;&#111;&#117;&#114;&#110;&#097;&#109;&#101;&#064;&#100;&#111;&#109;&#097;&#105;&#110;&#046;&#099;&#111;&#109;
    
    </A>

  • Действительно ли работает обфускация адресов электронной почты?

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

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

    Я не уверен, что добавление mailto:функциональности к исправлению повлияет на результаты.

  • Есть также много других вопросов по SO, на которые есть похожие ответы. Я не нашел ничего подходящего для желаемого эффекта


Вопрос:

Можно ли повысить эффективность (т. Е. Как можно меньше спама) описанных выше методов обфускации электронной почты, объединив два или более исправлений (или даже добавив новые исправления) при:

A- Поддержание mailto:функциональности; и

B- Поддержка программ чтения с экрана


Редактировать:

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

Вопрос, который задается / подразумевается :

Почему бы не использовать js?

Ответ: у меня аллергия на js

Шутя в сторону,

Я задал этот вопрос по трем основным причинам:

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

  • Если это можно сделать без сценариев, то это нужно делать без сценариев.

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


21
Я думаю, что если вы хотите сохранить mailto:функциональность и не хотите использовать Javascript, это просто невозможно.
xrisk

Вы хотите использовать CSS для изменения атрибутов HTML?
Мортеза Асади

@Rishav Я согласен с вами, что добиться желаемого эффекта без использования js может быть довольно сложно; однако я бы сказал, что существование таких методов, как тот, который я выделил, где вы кодируете электронное письмо как объекты HTML, может свести на нет невозможность этого.

@MortezaAsadi Можете ли вы опубликовать пример того, что вы назвали ответом?

@ i-love-css взгляните на эту статью: andydavies.me/blog/2012/08/13/…
Мортеза Асади

Ответы:


35

Проблема с вашим запросом связана именно с «Поддержкой программ чтения с экрана», поскольку программы чтения с экрана по определению являются своего рода «ботами». Если программе чтения с экрана необходимо иметь возможность интерпретировать адрес электронной почты, то сканер страниц также сможет интерпретировать его.

Кроме того, смысл mailtoатрибута - быть стандартом для работы с адресами электронной почты в Интернете. Спросить, есть ли второй способ сделать это, это как бы спросить, есть ли второй стандарт.

Выполнение этого с помощью сценариев по-прежнему будет иметь ту же проблему, что и после загрузки страницы, сценарий был бы запущен и адрес электронной почты отображался в DOM (если вы не заполните адрес электронной почты on clickили что-то в этом роде). В любом случае у программ чтения с экрана по-прежнему будут проблемы с этим, поскольку он еще не загружен.

Честно говоря, просто получите почтовый сервис с приличным спам-фильтром и укажите строку темы по умолчанию, которую вам легко сортировать в своем почтовом ящике.

<a href="mailto:no-one@no-where.com?subject=Something to filter on">Email me</a>

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


8
Отстойно бороться с роботами, но однажды мы выиграем войну ... или
вымрем

Извините, но когда роботы работают, они находят все строки с @, а затем разбивают этот текст ?и проверяют, совпадает ли первая часть с регулярным выражением. Наконец-то сохраните 2 версию
Адриан Бобровски

Не уверен, что вы имели в виду. Я добавляю строку темы в надежде, что конечный пользователь ее не изменит. Таким образом, вы можете создать фильтр электронной почты, чтобы помещать все эти тематические письма в определенную папку. Дело было не в том, чтобы предотвратить ботов, а в том, чтобы помочь правилам электронной почты. Как я уже сказал, предотвращение ботов - это бесконечная битва.
k2snowman69

Спасибо за внятный и подробный ответ. Я думаю, вы поднимаете обоснованный вопрос, когда говорите, что программы чтения с экрана - это, по сути, боты; однако идея состоит в том, чтобы скрыть электронную почту до тех пор, пока пользователь не выполнит какое-либо действие, например, нажмет кнопку, чтобы открыть модальное окно. После взаимодействия с пользователем открывается адрес электронной почты. Если этого можно достичь без использования скриптов, то это будет ответ на мой вопрос. Я даю этому ответу +1, потому что метод, в котором вы добавляете строку темы в электронные письма, а затем фильтруете сообщения на ее основе, является чистым гением.

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

29

Победить почтовых роботов непросто. Вы можете проверить раздел "Меры противодействия сбору адресов электронной почты" в Википедии.

Моя предыстория такова, что я написал поискового бота. Много лет назад он просканировал более 105 000 URL-адресов. Из того, что я сделал, это то, что боты для сканирования сети буквально видят ВСЕ, что является текстом, который появляется на веб-странице. Боты читают все, кроме изображений.

Спам нельзя легко остановить с помощью кода по следующим причинам:

  1. CSS и JS не имеют значения при использовании тега mailto :. Боты специально просматривают HTML-страницы по ключевому слову mailto :. Все от этого двоеточия до следующей одинарной или двойной кавычки (в зависимости от того, что наступит раньше) рассматривается как адрес электронной почты. Адреса электронной почты объекта HTML - как в примере выше - можно быстро преобразовать с помощью обратного метода / функции ASCII. Выполнение приведенного выше фрагмента кода JavaScript быстро преобразует строку, начинающуюся с: & # 121; & # 111; & # 117; & # 114; ..., в ... "yourname@domain.com". (Мой поисковый бот отбрасывал hrefs с адресами mailto: email, поскольку мне нужны были URL-адреса для веб-страниц, а не адреса электронной почты.)

  2. Если на странице происходит сбой бота, автор бота настроит бота для исправления сбоя с учетом этой страницы, чтобы бот не вылетал на этой странице снова в будущем. Таким образом, делая их бота умнее.

  3. Авторы ботов могут писать ботов, которые генерируют все известные варианты адресов электронной почты ... без сканирования страниц и никогда не используя никаких начальных адресов электронной почты. Хотя это может быть невозможно сделать, это вполне возможно с сегодняшними процессорами с большим количеством ядер (которые являются гиперпоточными и работают на частоте 4+ ГГц), а также с возможностью использования распределенных облачных вычислений и даже суперкомпьютеров. Вполне возможно, что теперь кто-то может создать бот-ферму для рассылки спама всем, не зная чьих-либо адресов электронной почты. 20 лет назад это было бы непостижимо.

  4. Провайдеры бесплатной электронной почты не раз продавали свои бесплатные учетные записи своим рекламодателям. В прошлом простая регистрация бесплатной учетной записи электронной почты автоматически гарантировала им зеленый свет, чтобы начать рассылку спама на этот адрес электронной почты ... без использования этого адреса электронной почты в Интернете. Я видел это несколько раз с известными названиями компаний. (Я не буду называть никаких имен.)

  5. Ключевое слово mailto: является частью этого IETF RFC , в котором браузеры созданы для автоматического запуска почтовых клиентов по умолчанию из ссылок с этим ключевым словом в них. Если это произойдет, необходимо использовать JavaScript, чтобы прервать процесс запуска приложения.

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

Есть одна альтернатива ... Вы также можете создать почтовый клиент, похожий на чат, который работает внутри веб-сайта. Это было бы похоже на чат-клиент Facebook. Это «вроде как электронная почта», но на самом деле это не электронная почта. Это просто обмен мгновенными сообщениями один на один с функцией архивирования ... которая автоматически загружается при входе в систему. Поскольку в нем есть вложение документа + ссылка, он работает как электронная почта ... но без спама. Пока вы не создаете API, доступный извне, это закрытая система, в которую люди не могут отправлять спам.

Если вы планируете придерживаться строго традиционной электронной почты, то лучшим вариантом может быть запуск чего-то вроде Apache SpamAssassin на почтовом сервере компании.

Вы также можете попробовать комбинировать несколько стратегий, перечисленных выше, чтобы сборщикам электронной почты было сложнее собирать адреса электронной почты с ваших веб-страниц. Они не остановят 100% спама, 100% времени ... а также позволяют 100% программ чтения с экрана работать для слепых посетителей.

Вы создали действительно хороший стартовый взгляд на то, что не так с традиционной электронной почтой! Престижность вам за это!

Хорошим средством чтения с экрана является JAWS от Freedom Scientific . Я использовал это раньше, чтобы слушать, как мои веб-страницы читают слепые пользователи. (Если вы слышите мужской голос, читающий оба действия [например, нажатие на ссылку] и текст, попробуйте изменить один голос на женский, чтобы один голос читал действия, а другой - текст. Это облегчит понимание того, как читается веб-страница. слабовидящим.)

Удачи в ваших усилиях по противодействию сбору адреса электронной почты !


2
Большое спасибо за очень обстоятельный ответ. Вы поделились огромным количеством информации. Эта информация помогает в дальнейшем уточнить проблему и в конечном итоге может привести к поиску способа ее решения.

Пожалуйста! Было приятно попытаться помочь вам с дополнительным эмпирическим пониманием. Я ценю награду. Это было сюрпризом. Спасибо за это!
Clomp

26

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

<a
  href="#"
  data-contact="bGUtZW1haWxAdGhlLWRvbWFpbi5jb20="
  data-subj="QW4gQW1hemluZyBTdWJqZWN0"
  onfocus="this.href = 'mailto:' + atob(this.dataset.contact) + '?subject=' + atob(this.dataset.subj || '')"
  >
  Send an email
</a>

data-contact- это адрес электронной почты в кодировке base64. И data-subjэто необязательный объект в кодировке base64.

Основная проблема при выполнении этого без JS заключается в том, что CSS не может изменять атрибуты HTML. ( Статья, на которую вы ссылаетесь, представляет собой размышление о "пироге в небе" и не имеет никакого отношения к тому, что возможно сегодня или в ближайшем будущем.)

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

При описанном выше подходе использование адреса электронной почты в кодировке base64 в data-contactатрибуте является очень "разовым" - если парсер не предназначен специально для вашего сайта, он должен работать.


Мне это нравится. Если у них не включен js, они могут отправить письмо кому-нибудь еще.
Майкл Роджерс

15

Простой + Много @ + Редактируется без инструментов

<a href="mailto:user@domain@@com"
   onmouseover="this.href=this.href.replace('@@','.')">
   Send email
</a>


Мне нравится этот аккуратный отрывок!
Marlon Creative

2
люблю эту мелочь, @AndyHolmes, я использовал для этого onclick = "...", работает и на мобильных устройствах (проверено на android / mobile chrome), не знаю, если это станет более бесполезным, так как боты, вероятно, проверят наличие onclick больше чем onmouseover.
goleon

2
@goleon onclick будет работать на мобильных устройствах, onmouseover - нет, поскольку на мобильных устройствах нет состояния зависания,
Энди Холмс,

7

Вы рассматривали возможность использования Google Recaptcha mailhide? https://www.google.com/recaptcha/admin#mailhide

Идея заключается в том, что когда пользователь устанавливает флажок ( см. Nocaptcha ниже ), отображается полный адрес электронной почты.

Хотя рекапча традиционно сложна не только для программ чтения с экрана, но и для людей, с ролевой функцией рекапчи google nocaptcha, о которой вы можете прочитать здесь, поскольку они относятся к тестам доступности. Это выглядит многообещающим в отношении программ чтения с экрана, поскольку с их точки зрения отображается как традиционный флажок. Nocaptcha reCAPTCHA

Пример №1 - Небезопасно, но для простой иллюстрации идеи

Вот пример кода без использования mailhide, но реализация чего-то с использованием recaptcha самостоятельно: https://jsfiddle.net/43fad8pf/36/

<div class="container">
    <div id="recaptcha"></div>
</div>
<div id="email">
    Verify captcha to get e-mail
</div>

function createRecaptcha() {
    grecaptcha.render("recaptcha", {sitekey: "6LcgSAMTAAAAACc2C7rc6HB9ZmEX4SyB0bbAJvTG", theme: "light", callback: showEmail});
}
 createRecaptcha();

function showEmail() {
    // ideally you would do server side verification of the captcha and then the server would return the e-mail
  document.getElementById("email").innerHTML = "email@something.com";
}

Примечание: в моем примере у меня есть электронная почта в функции javascript. В идеале рекапча должна быть проверена на стороне сервера и возвращено электронное письмо, в противном случае бот может просто получить его в коде.

Пример # 2 - Проверка на стороне сервера и возврат электронной почты

Если мы воспользуемся подобным примером, мы получим дополнительную безопасность: https://designracy.com/recaptcha-using-ajax-php-and-jquery/

function showEmail() {
    /* Check if the captcha is complete */
    if ($("#g-recaptcha-response").val()) {
        $.ajax({
            type: ‘POST’,
            url: "verify.php", // The file we’re making the request to
            dataType: ‘html’,
            async: true,
            data: {
                captchaResponse: $("#g-recaptcha-response").val() // The generated response from the widget sent as a POST parameter
        },
        success: function (data) {
            alert("everything looks ok. Here is where we would take 'data' which contains the e-mail and put it somewhere in the document");
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("You’re a bot");
        }
    });
} else {
    alert("Please fill the captcha!");
}
});

Где verify.php:

$captcha = filter_input(INPUT_POST, ‘captchaResponse’); // get the captchaResponse parameter sent from our ajax

/* Check if captcha is filled */
if (!$captcha) {
    http_response_code(401); // Return error code if there is no captcha
}
$response =     file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=YOUR-SECRET-KEY-HERE&amp;amp;response=" . $captcha);
if ($response . success == false) {
echo ‘SPAM’;
http_response_code(401); // It’s SPAM! RETURN SOME KIND OF ERROR
} else {
// Everything is ok, should output this in json or something better, but this is an example
    echo 'email@something.com'; 
}

4

Люди, которые пишут скреперы, хотят сделать свои скребки максимально эффективными. Поэтому они не будут загружать стили, скрипты и другие внешние ресурсы. Я не знаю способа установить mailtoссылку с помощью CSS. Кроме того, вы специально сказали, что не хотите устанавливать ссылку с помощью Javascript.

Если вы думаете о том, какие еще типы ресурсов существуют, есть также внешние документы (например, HTML-документы, использующие фреймы). Практически никакие парсеры не потрудились бы загрузить содержимое фреймов. Поэтому вы можете просто сделать:

index.html:

<iframe src="frame.html" style="height: 1em; width: 100%; border: 0;"></iframe>

frame.html:

My email is <a href="mailto:me@example.com" target="_top">me@example.com</a>

Для пользователей-людей iframe выглядит как обычный текст. По умолчанию фреймы встроены и прозрачны, поэтому нам просто нужно установить его границу и размеры. Вы не можете заставить размер iframe соответствовать размеру его содержимого без использования Javascript, поэтому лучшее, что мы можем сделать, - это указать ему предопределенные размеры.


3
Я согласен с вами в отношении вашего 1-го абзаца, но ваш 2-й абзац о содержимом iframe неверен. Боты хотят как можно больше HTML-контента. Они будут загружать содержимое iframe, так как ищут ссылки, текст и т. Д. Ботов не волнует, тег iframe это или нет. Они просто будут сканировать страницы. Если URL находится в разделе src тега iframe или javascript, он будет просканирован.
Clomp

3

Во-первых, я не думаю, что что-то с помощью CSS будет работать. Все боты (кроме краулера Google) просто игнорируют все стили на веб-сайтах. Любое решение должно работать с JS или на стороне сервера.

Решение на стороне сервера может заключаться в создании <a>ссылки на новую вкладку, которая просто перенаправляет на желаемое mailto:

На данный момент это все мои идеи. Надеюсь, поможет.


1
Хотя, когда я тестировал это около года назад, все основные браузеры поддерживали это, я мог видеть, что обработка mailto:как местоположение в перенаправлении 302 исчезает из соображений "безопасности", так как вы уже не можете этого file:больше. (При этом мы используем это перенаправление как запасной вариант, когда javascript отключен.)
Ульрих Шварц

Это правда. Хорошая мысль
Пабло Квитца

2

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

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


Они могут использовать какое-то шифрование электронной почты и динамически расшифровать ее с помощью JavaScript. Даже простой шифр +1 может помочь. Теоретически ломается, но никакой бот не сломает его.
john ktejik 05

0

Решение PHP

function printEmail($email){
    $email = '<a href="mailto:'.$email.'">'.$email.'</a>';
    $a = str_split($email);
    return "<script>document.write('".implode("'+'",$a)."');</script>";
}

Использовать

echo printEmail('test@gmail.com');

Результат

<script>document.write('<'+'a'+' '+'h'+'r'+'e'+'f'+'='+'"'+'m'+'a'+'i'+'l'+'t'+'o'+':'+'t'+'e'+'s'+'t'+'@'+'g'+'m'+'a'+'i'+'l'+'.'+'c'+'o'+'m'+'"'+'>'+'t'+'e'+'s'+'t'+'@'+'g'+'m'+'a'+'i'+'l'+'.'+'c'+'o'+'m'+'<'+'/'+'a'+'>');</script>

PS Требование: у пользователя должен быть включен JavaScript


-3

Один из эффективных способов - использовать его с CSS, как показано ниже:

<a href="mailto:myemail@ignore-domain.com">myemail@<span style="display:none;">ignore-</span>domain.com

а затем напишите javascript, чтобы удалить ignoreme-слово из href="mailto:..."атрибута с помощью регулярного выражения. Это скроет электронную почту от бота, так как она добавит ignore-слово перед реальным доменом, и это будет работать в программе чтения с экрана, и когда пользователь нажимает на ссылку, пользовательская функция js удаляет ignore-слово из hrefатрибута, чтобы открыть настоящее письмо.

Этот метод до сих пор работал у меня очень эффективно. вы можете узнать больше об этом - http://techblog.tilllate.com/2008/07/20/ten-methods-to-obfuscate-e-mail-addresses-compared/


Извините, но этот метод не подходит, потому что большинство, если не все хорошие боты просматривают текст привязки и a href. Использование display:noneне принесет успеха.
Саймон Хейтер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.