Ниже перечислены лучшие техники для сокрытия email-адресов от глаз спам-ботов, наряду со статистикой их эффективности.

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

1. Открытый текст

Эта категория ориентирована на защиту адресов, записанных простым текстом (например, email@example.com).

1.1 Без защиты

Заблокировано 0% из 426 ботов.

HTML

aa@email.spencermortensen.com

1.2 HTML. Сущности

Заблокировано 95% из 426 ботов.

HTML

ab@email.spencermortensen.com

Серверные библиотеки часто декодируют HTML-сущности автоматически, так что эта техника должна быть бесполезной — тем не менее она каким-то образом отсекает большинство харвестеров.

1.3 HTML. Комментарии

Заблокировано 99% из 426 ботов.

HTML

ac@email.spencermortensen<!--.example-->.com

Эта техника способна заблокировать большинство простых харвестеров, которые не умеют парсить HTML-теги. То есть защиту она обеспечивает минимальную, хотя большинство посягательств как-то заблокировала.

1.4 HTML. Внешний SVG

Заблокировано 100% из 426 ботов.

HTML

<object class="email" width="130" height="24" data="email.svg" type="image/svg+xml"></object>
SVG: email.svg

<svg viewBox="0 0 130 24" xmlns="http://www.w3.org/2000/svg">

<style>
@import url('https://fonts.googleapis.com/css2?family=Indie+Flower&amp;display=swap');

text {
	dominant-baseline: middle;
	fill: #000;
	font-family: 'Indie Flower';
	font-size: 16px;
	text-anchor: middle;
}
</style>

<text x="50%" y="50%">email@example.com</text>

</svg>
CSS

object.email {
	height: 2em;
	margin: -1em 0;
	vertical-align: middle;
}

По мотивам: rouninmedia.github.io

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

Эта техника доступна всем пользователям, включая тех, кто зависит от экранного диктора. Но для её работы необходимо использовать элемент object. Если взять элемент img, то вы получите не интерактивное изображение, а если просто встроить SVG, то адрес почты окажется в исходном коде, где харвестеры легко его найдут.

Атрибуты “width” и “height” помогают исключить смещение макета в процессе загрузки страницы. Поскольку размеры зависят от выбранного шрифта, то для избежания проблем с отрисовкой в SVG-файле шрифт нужно указывать явно.

1.5 CSS. Свойство “display: none”

Заблокировано 100% из 426 ботов.

CSS

<div class="email">ad@<span>email.</span>spencermortensen.<span>example.</span>com</div>
CSS

div.email > span:nth-child(2) {
	display: none;
}

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

Это решение доступно для всех, включая пользователей экранных дикторов. Но здесь для сокрытия текста обязательно применять display: none. Если использовать исключительно визуальную технику (например, уменьшение шрифта или его вынос за границы экрана), это негативно скажется на пользовательском опыте.

1.6 JS. Объединение строк

Заблокировано 100% из 426 ботов.

HTML

<script>document.write('a'+'i'+'@'+'e'+'m'+'a'+'i'+'l'+'.'+'s'+'p'+'e'+'n'+'c'+'e'+'r'+'m'+'o'+'r'+'t'+'e'+'n'+'s'+'e'+'n'+'.'+'c'+'o'+'m');</script>

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

1.7 JS. Rot18

Заблокировано 100% из 426 ботов.

HTML

<span class="email">nw@rznvy.fcraprezbegrafra.pbz</span>
HTML

<head>
	<script src="text-rot18.js" defer></script>
</head>

text-rot18.js

Эта техника обходится примитивными харвестерами, не интерпретирующими JS. Здесь вам как минимум нужно действовать нестандартно, то есть сдвигать каждую букву не на 13 позиций, а каждую цифру не на 5.

1.8 JS. Преобразование

Заблокировано 100% из 426 ботов.

HTML

<span id="text-conversion">zibby example com</span>
HTML

<head>
	<script src="text-conversion.js" defer></script>
</head>

text-conversion.js

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

Большинство харвестеров получают доступ только к исходному HTML, который в этом случае не содержит ничего для них ценного. Единственный практический способ восстановить адрес почты — это выполнить созданную функцию в веб-клиенте с поддержкой DOM и JS. Большинство харвестеров этого не умеют.

Можно написать отдельную функцию для каждого адреса, либо одну и применять её ко всем адресам на странице.

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

1.9 JS. AES-шифрование

Заблокировано 100% из 426 ботов.

HTML

<span class="email">Kreuz2xa6xB8Fpjaa0lFgACNLO6n_Auu1CGjcG8z_Ec</span>
HTML

<head>
	<script src="text-aes.js" defer></script>
</head>

text-aes.js

В этой технике адрес шифруется алгоритмом AES-256. (AES — это единственный открыто доступный алгоритм, одобренный АНБ для шифрования сверхсекретной информации). При её использовании адрес невозможно восстановить без специального JS-файла — к которому у большинства харвестеров нет доступа или возможности его выполнить. В этой реализации используется собственная криптографическая библиотека браузера, так что выполнить расшифровку в другой среде, даже с поддержкой JS, не получится.

Сама библиотека, SubtleCrypto, доступна только в защищённых контекстах (таких как https или localhost), что может стать препятствием, если вы используете http. Для применения этой техники потребуется перейти на https.

1.10 JS. Активация через действия пользователя

Заблокировано 100% из 426 ботов.

HTML

<span id="text-interaction">whose baby example com</span>
HTML

<head>
	<script src="text-interaction.js" defer></script>
</head>

text-interaction.js

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

Этот механизм можно использовать для активации других техник.

1.11 HTML. Подмена символов

Заблокировано 96% из 426 ботов.

HTML

ag AT email DOT spencermortensen DOT com

Это хорошо известная техника, которая легко реверсится, так что к безопасным её не отнесёшь.

Создаёт неудобства. Пользователю, чтобы отправить почту, сначала нужно восстановить все заменённые символы.

1.12 HTML. Добавление инструкций

Заблокировано 100% из 426 ботов.

HTML

au.fluff@email.spencermortensen.com (Чтобы написать мне, удалите “.fluff”)

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

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

Создаёт неудобство. Пользователю нужно понять инструкции и в точности их выполнить. В противном случае связаться с вами у него не получится.

1.13 HTML. Изображение

Заблокировано 100% из 426 ботов.

HTML

<img src="email.jpg" width="216" height="18" alt="email address">

email.jpg

Для некоторых пользователей такое решение окажется неудобным или недоступным.

Создаёт неудобство. Зрячие пользователи вынуждены вводить адрес почты вручную. Остальные же просто не смогут с вами связаться.

1.14 CSS. Свойство content

Заблокировано 100% из 426 ботов.

HTML

<span class="email" data-user="af" data-domain="email.spencermortensen.com"></span>
CSS

span.email::after {
	content: attr(data-user) '@' attr(data-domain);
}

Этот подход лишает человека простейших удобств (например, текст можно видеть, но нельзя копировать), поэтому ценности не представляет.

Харвестеры могут восстановить полный адрес из одного только HTML, не интерпретируя CSS. Так что безопасным этот способ не назовёшь.

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

1.15 CSS. Изменение направленности текста

Заблокировано 100% из 426 ботов.

HTML

<span class="email">moc.nesnetromrecneps.liame@ea</span>
CSS

span.email {
	unicode-bidi: bidi-override;
	direction: rtl;
}

Эта техника тоже не самая удобная, и её могут обойти даже простые харвестеры, которые не интерпретируют CSS. Можно отнести её к бесполезным.

Создаёт неудобства. Адрес почты можно скопировать, но его текст перевёрнут. В итоге напишут вам только те, кто не поленится набирать его вручную.

2. Кликабельные ссылки

Эта группа техник ориентирована на защиту кликабельных ссылок, которые открывают почтовый клиент пользователя (например, email). Заметьте, что защищается только атрибут href “mailto:”. Если текст ссылки также содержит адрес почты, то этот адрес будет раскрыт в виде простого текста, и вам потребуется применить как минимум одну технику обфускации из списка выше.

2.1 Без защиты

Заблокировано 0% из 399 ботов.

HTML

<a href="mailto:am@email.spencermortensen.com">email</a>

2.2 HTML. Сущности

Заблокировано 100% из 399 ботов.

HTML

<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#110;&#64;&#101;&#109;&#97;&#105;&#108;&#46;&#115;&#112;&#101;&#110;&#99;&#101;&#114;&#109;&#111;&#114;&#116;&#101;&#110;&#115;&#101;&#110;&#46;&#99;&#111;&#109;">email</a>

Библиотеки на стороне сервера часто декодируют HTML-сущности автоматически, так что эта техника кажется неэффективной, хотя она всё же блокирует большинство харвестеров.

2.3 HTML. Кодирование URL

Заблокировано 95% из 399 ботов.

HTML

<a href="mailto:%61%6f%40%65%6d%61%69%6c%2e%73%70%65%6e%63%65%72%6d%6f%72%74%65%6e%73%65%6e%2e%63%6f%6d">email</a>

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

2.4 HTTP. Редирект

Заблокировано 100% из 399 ботов.

HTML

<a rel="nofollow, noindex" href="email/">email</a>
.htaccess

RewriteEngine On

RewriteRule ^email/$ 'mailto:email@example.com' [R=302,L]
.htaccess

RewriteEngine On

RewriteRule ^email/$ 'mailto:email@example.com?subject=Hi' [R=302,QSA,L]

Эта техника превращает ссылку mailto: в обычную с сохранением почтовых свойств и скрывает её среди других ссылок на странице.

Если вы планируете заполнять какие-то поля в письме, то для сохранения строки запроса вам нужно использовать вторую форму файла .htaccess (добавив флаг QSA).

Поскольку эта ссылка не ведёт на какую-либо реальную страницу, поисковые движки могут воспринимать её, как битую. Чтобы этого не происходило, используются теги “nofollow, noindex”, отключающие переход по этим ссылкам и их индексацию.

Когда вы добьётесь желаемого перенаправления, то можете перейти с его временной формы (302) на постоянную (301). После утверждения постоянного редиректа ваш браузер будет игнорировать все последующие изменения. Это усложнит будущее тестирование, зато ускорит перенаправление.

2.5 HTML. Внешний SVG

Заблокировано 100% из 399 ботов.

HTML

<object class="email" width="33" height="24" data="email.svg" type="image/svg+xml"></object>
SVG: email.svg

<svg viewBox="0 0 33 24" xmlns="http://www.w3.org/2000/svg">

<style>
@import url('https://fonts.googleapis.com/css2?family=Indie+Flower&amp;display=swap');

text {
	dominant-baseline: middle;
	fill: #000;
	font-family: 'Indie Flower';
	font-size: 16px;
	text-anchor: middle;
}
</style>

<a href="mailto:email@example.com">
	<text x="50%" y="50%">email</text>
</a>

</svg>
CSS

object.email {
	height: 2em;
	margin: -1em 0;
	vertical-align: middle;
}

По мотивам: rouninmedia.github.io

Эта техника скрывает адрес в необычном месте, где большинство харвестеров искать не станут. Но помещает она его туда в виде простого текста.

Доступность адреса в этом случае полная, и его смогут найти даже те, кто пользуется экранным диктором. Только реализовывать этот подход нужно через элемент object. Если взять элемент img, вы получите не интерактивное изображение, а при простом встраивании SVG адрес окажется в исходном коде, где харвестеры легко его найдут.

Атрибуты “width” и “height” исключают смещение макета в процессе загрузки страницы. А поскольку эти размеры зависят от используемого шрифта, то для избежания проблем с отрисовкой его нужно явно указывать в SVG-файле.

2.6 JS. Объединение строк

Заблокировано 100% из 399 ботов.

HTML

<script>document.write('<a href="mailto:'+'a'+'p'+'@'+'e'+'m'+'a'+'i'+'l'+'.'+'s'+'p'+'e'+'n'+'c'+'e'+'r'+'m'+'o'+'r'+'t'+'e'+'n'+'s'+'e'+'n'+'.'+'c'+'o'+'m'+'">email</a>');</script>

Это удобный метод, так как вопреки отсутствию внешних зависимостей, он умудряется блокировать большинство харвестеров. Тем не менее весь адрес полностью содержится в HTML, так что безопасной эту технику не назовёшь.

2.7 JS. Rot18

Заблокировано 99% из 399 ботов.

HTML

<a class="email" href="znvygb:nd@rznvy.fcraprezbegrafra.pbz">email</a>
HTML

<head>
	<script src="link-rot18.js" defer></script>
</head>

link-rot18.js

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

2.8 JS. Преобразование

Заблокировано 100% из 399 ботов.

HTML

<a id="link-conversion" rel="nofollow, noindex" href="to-email-spencer/">email</a>
HTML

<head>
	<script src="link-conversion.js" defer></script>
</head>

link-conversion.js

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

Большинство харвестеров могут получать доступ только к HTML-исходнику, который в этом случае не содержит ничего ценного. Единственный практический способ восстановить ссылку — это выполнить кастомную функцию преобразования в веб-клиенте с поддержкой DOM и JS, на что подавляющее число харвестеров неспособны.

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

Несмотря на свою пугающую простоту, эта техника является одной из лучших.

2.9 JS. AES-шифрование

Заблокировано 100% из 399 ботов.

HTML

<a class="email" rel="nofollow, noindex" href="xd7L-AOA9Qckl5RXbFuFw8LxuiPZPk3vzyPS55-KlD-a78c00rng">email</a>
HTML

<head>
	<script src="link-aes.js" defer></script>
</head>

link-aes.js

В этой технике адрес почты шифруется с помощью AES-256. (AES — это единственный общедоступный алгоритм, одобренный АНБ для шифрования сверхсекретной информации). В итоге адрес невозможно восстановить без специального JS- файла, к которому у большинства харвестеров нет доступа или возможности его выполнить. Эта реализация использует встроенную криптографическую библиотеку браузера, поэтому расшифровать код в другой среде, даже с поддержкой JS, не выйдет.

Используемая библиотека, SubtleCrypto, доступна только в защищённых контекстах (таких как https или localhost), что может стать препятствием для тех, кто пользуется http. Придётся переходить на https.

2.10 JS. Активация через действия пользователя

Заблокировано 100% из 399 ботов

HTML

<a id="link-interaction" rel="nofollow, noindex" href="to-email-spencer/">email</a>
HTML

<head>
	<script src="link-interaction.js" defer></script>
</head>

link-interaction.js

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

Этот механизм также можно использовать для запуска других техник.

3. Возражения

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

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

Да вам не нужны эти техники. Вот мой адрес находится в сети без какой-либо защиты, и спам меня не тревожит.

Харвестеры уделяют разным страницам разное количество внимания. Чем популярнее контент, тем глубже он анализируется. Всё прочее просто игнорируется. Поскольку статья может внезапно стать вирусной, пренебрегать защитой опасно.

Вам достаточно просто хорошего спам-фильтра.

В отличие от фильтров, эти техники не имеют ложных срабатываний, легко настраиваются и очень эффективны — почему бы их не использовать?

Я знаю, как сломать эти техники, так что они бессмысленны.

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

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

Эти техники не новы. Статистика по эффективности некоторых из них собирается десятилетиями. И факт в том, что по какой-то причине они остаются всё так же эффективны, как и в далёком прошлом.

4. Методология

Статья предназначена не только для людей. Это также и приманка для харвестеров. Каждая из приведённых техник защищает определённый адрес почты. Когда этот адрес получает спам, я понимаю, что техника была взломана. Я веду список адресов, которые известны спамерам, и по нему определяю, о каких адресах они ещё не знают (иными словами, какие техники успешно защищают свой адрес).

Я не хочу искажать статистику произвольными деталями, такими как объём отправленных спам-писем, поэтому группирую все сообщения просто по отдельным ботам. Это сложнее, чем может показаться, так как спамеры зачастую стремятся скрыть свою идентификацию. Моя система неидеальна, но я стараюсь подсчитывать только спамеров, а не их сообщения.

Прежде чем собирать какую-либо статистику, мне пришлось отключить всю фильтрацию спама, которая обычно происходит в фоновом режиме. Некоторые крупные почтовые сервисы фильтруют спам-сообщения (часть из них попадает в папку «Спам», но некоторые молча удаляются на ещё более ранних этапах). Десктопные клиенты тоже это умеют. Поэтому я настроил собственный почтовый сервер и клиента исключительно с целью сбора статистики для этого проекта.

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

Собранную статистику также нельзя назвать однозначной, так как размер выборки всё же маловат. Тем не менее, чем больше ссылок на эту статью, тем больше ботов её увидит, и тем точнее станут результаты анализа.