Эффективный способ скрыть электронную почту от спам-ботов

196

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

<a href="admin [at] example.com"
   rel="nofollow"
   onclick="this.href='mailto:' + 'admin' + '@' + 'example.com'">Contact me</a>

Что вы думаете об этом? Это эффективно? Какие еще методы вы знаете или используете?

абатищев
источник
Либо это дубликат stackoverflow.com/questions/163628/… , либо этот другой недействителен, потому что это длинный список вики-сообщества.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
5
У этого есть больше голосов, ответа и взглядов. Это не должно быть закрыто в пользу другого, имеющего меньше голосов, ответов и мнений.
Абатищев
1
Я бы закрыл этот, чтобы следить за тем, что этот привлекает гораздо больше.
Абатищев
6
Лучшее решение - не делиться своим решением . К сожалению, это такой вопрос. Лучше всего найти свое решение и сохранить его при себе. Если кто-то станет стандартизированным, спам-боты будут адаптированы для его преодоления.
Димитрис
1
Лучшее решение состоит в том, чтобы объединить несколько из приведенных ниже решений , например, первую часть электронной почты в виде изображения, вторую часть this.href.replace(/x/g,''), третью часть в шестнадцатеричном кодировании и т. Д. Ни один спам-бот, каким бы умным он ни был, не будет пробовать разные методы декодирования в разных частях адрес электронной почты.

Ответы:

98

Это метод, который я использовал, с включением на стороне сервера, например, <!--#include file="emailObfuscator.include" -->где emailObfuscator.includeсодержит следующее:

<!-- // http://lists.evolt.org/archive/Week-of-Mon-20040202/154813.html -->
<script type="text/javascript">
    function gen_mail_to_link(lhs,rhs,subject) {
        document.write("<a href=\"mailto");
        document.write(":" + lhs + "@");
        document.write(rhs + "?subject=" + subject + "\">" + lhs + "@" + rhs + "<\/a>");
    }
</script>

Чтобы включить адрес, я использую JavaScript:

<script type="text/javascript"> 
    gen_mail_to_link('john.doe','example.com','Feedback about your site...');
</script>
<noscript>
  <em>Email address protected by JavaScript. Activate JavaScript to see the email.</em>
</noscript>

Поскольку я получаю электронную почту через Gmail с 2005 года, спам, в основном, не является проблемой. Поэтому я не могу говорить о том, насколько эффективен этот метод. Возможно, вы захотите прочитать это исследование (хотя оно и старое), которое подготовило этот график:

введите описание изображения здесь

Fuhrmanator
источник
Зачем вам нужно включение на стороне сервера emailObfuscator.include? Разве это не было бы так же, как писать это в простом .html? (возможно, это просто пример?) Также, почему вы используете html-комментарии <!-- -->внутри скрипта? И, наконец, почему один из ваших <script>тегов в нижнем регистре, а другие в верхнем регистре <SCRIPT>? Эти методы помогают сбить с толку ботов или что-то?
тамплиер
@Templar Насколько мне известно, SSI не нужен и не смущает ботов. Это делает мой сайт модульным (больше не используйте этот метод). В комментарии была ссылка на источник, где я нашел взлом (теперь неработающая ссылка). Изменение в случае просто случайность. Если это смущает ботов, тем лучше, но я сомневаюсь, что это повлияет.
Фурманатор
4
Более недавнее и полное исследование, исследующее ту же идею: grall.name/posts/1/antiSpam-emailAddressObfuscation.html
Лукас Кимон,
97

Работа с контентом и атрибутом в CSS:

.cryptedmail:after {
  content: attr(data-name) "@" attr(data-domain) "." attr(data-tld); 
}
<a href="#" class="cryptedmail"
   data-name="info"
   data-domain="example"
   data-tld="org"
   onclick="window.location.href = 'mailto:' + this.dataset.name + '@' + this.dataset.domain + '.' + this.dataset.tld; return false;"></a>

Когда JavaScript отключен, просто событие нажатия не будет работать, электронная почта по-прежнему отображается.

Другой интересный подход (по крайней мере, без события щелчка) заключается в использовании метки справа налево для переопределения направления письма. Подробнее об этом: https://en.wikipedia.org/wiki/Right-to-left_mark

оборота кипарис
источник
6
Это требует больше больших пальцев.
HeXer
Не знаю почему, но хотя это решение выглядит довольно впечатляюще, оно не запускает мой почтовый клиент. Вот скрипка для тестирования: jsfiddle.net/wd436tg3
Рикардо
1
@RicardoZea, какой браузер вы используете? у меня твоя скрипка отлично работает в chrome, т.е. 11, edge и firefox
cyptus
3
Потрясающие. Но добавьте «; верните false» к событию onclick. Это предотвратит неприятное добавление # к URL-адресу браузера (отменив исходную ссылку href)
T4NK3R
5
ОДНАКО - я не могу вручную скопировать (видимый) почтовый адрес (в Chrome, Firefox или Edge)?
T4NK3R
83

Посмотрите на этот способ , довольно умный и использующий CSS.

CSS

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

HTML

<span class="reverse">moc.rehtrebttam@retsambew</span>

Приведенный выше CSS переопределит направление чтения и представит текст пользователю в правильном порядке.

Надеюсь, поможет

ура

roundcrisis
источник
54
Это конечно смешно. Но, к сожалению, это не кликабельно и не будет работать для копирования / вставки, пренебрегая любым не-CSS браузером, таким как читатели Брайля.
Арджан
Ммм, приятно, но как только люди, пишущие сканерами, видят это, оно становится бесполезным.
Мау
6
Сопоставить обратный адрес электронной почты с RegEx так же просто, как сопоставить его без обратного. Спам - это бизнес на миллиард долларов, и спаммеры даже не используют свои собственные циклы ЦП для очистки экранов. Фактически, они уже прочитали этот разговор и соответствующим образом скорректировали свои методы. Все, что читается компьютером, будет доступно для чтения ботам. Будет ли это выполнено CSS или JavaScript.
Яни Hyytiäinen
3
@ JaniHyytiäinen Я не согласен. Тот факт, что они не платят за процессор, не означает, что они имеют неограниченные ресурсы. Если при запуске интерпретатора JS окажется слишком мало адресов из-за его стоимости, они отключат его.
о0 '.
1
@Lohoris: Google сообщает, что среднее время загрузки страницы (2,45 с) и средний размер страницы (320 КБ) дает представление о том, сколько разборов вы можете выполнить. Пока поток загрузки выполняет запросы, поток анализа может выполнять анализ. Большинство скачиваний ждет. Что дает потоку dl возможность проверки предварительных условий перед тем, как принять решение отправить его в анализатор. Например, рендеринг страницы, indexOf ('@'), indexOf ('mailto:') и т. Д. Поток синтаксического анализа будет получать только + -200 символов во время совпадения, что позволит выполнить настолько сложный синтаксический анализ, что он будет "казаться" бесконечным в условия разбора власти.
Яни Хюйтяйнен
52

У меня совершенно другой взгляд на это. Я использую MailHide для этого.

MailHide - это система от Google, в которой пользователю необходимо пройти тест reCAPTCHA, чтобы затем раскрыть ему электронное письмо.

tvanfosson
источник
15
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
showdev
5
Хотя я в целом согласен с этим мнением, в этом случае ответ заключается в использовании определенного инструмента. Если ссылка исчезнет, ​​я удалю ответ.
tvanfosson
Спасибо - это здорово. Я пишу что-то вроде этого (раскрыть это ссылка): Пришлите мне по электронной почте: раскрыть
chrs
6
Обратите внимание, что Google отключил MailHide по состоянию на Матч 2018. Как всегда с «бесплатными» сервисами Google: они предлагают их, если они могут получать прибыль от данных и, когда они получают то, что им нужно, они отбрасывают их. Самая ненадежная компания, предлагающая бесплатные услуги. Я бы держался подальше от сервисов Google или других лиц, если бы вам нужно было передавать то, что вы пытаетесь сделать.
Маси
51

Первоначально не моя идея, но я не могу найти автора:

<a href="mailto:coxntact@domainx.com"
    onmouseover="this.href=this.href.replace(/x/g,'');">link</a>

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

Эндрю Свифт
источник
2
Ухоженная! Но как насчет мобильных пользователей?
Бодзио
Мышки также запускаются при нажатии на ссылку. Это должно работать нормально.
Эндрю Свифт
4
Работает, пока ваш адрес не содержит х. :-p Но я знаю, просто используйте другое письмо.
Дэн Хендерсон
1
Но затем, если javascript отключен, вы предоставляете пользователям несуществующий адрес, который отскочит назад, потеряв вас клиент / пользователь.
Ксевис
34
Если javascript отключен, ни один из моих сайтов не работает вообще ;-)
Эндрю Свифт,
16

Я думаю, что единственный надежный метод, который вы можете использовать, - это создание страницы «Свяжитесь со мной», которая представляет собой форму, отправляемую в сценарий, который отправляется на ваш адрес электронной почты. Таким образом, ваш адрес никогда не будет открыт для публики. Это может быть нежелательно по какой-то причине, но я думаю, что это довольно хорошее решение. Меня часто раздражает, когда я вынужден скопировать / вставить чей-либо адрес электронной почты со своего сайта в мой почтовый клиент и отправить ему сообщение; Я бы предпочел сделать это прямо через форму на их сайте. Кроме того, этот подход позволяет отправлять вам анонимные комментарии и т. Д. Просто убедитесь, что вы защищаете свою форму с помощью какой-либо анти-бот-схемы, такой как капча. Есть много из них обсуждались здесь на SO.

rmeador
источник
6
Единственная проблема заключается в том, что у вас нет копии отправленного вами сообщения, если только вы не нашли время скопировать и вставить его в другое место. Лично я не против копировать и вставлять, но каждому свое.
gvkv
6
Что касается отправителя, у которого нет копии: для многих видов форм в Интернете мне нравится возможность получить копию самостоятельно. Однако часто такая опция допускает злоупотребления для анонимной отправки сообщений практически любому ...
Арджан,
12
Это может скрыть ваш адрес электронной почты, но не остановит спам, если вы не защитите свою форму скриптом проверки изображения с картинки.
SimonDowdles
1
Вы также можете решить проблему, когда отправитель не имеет копии, включив возможность отправить ее также.
steinybot
1
Опция «Отправить копию себе» - эффективно превращает форму в спам-канон, с вами как отправителем - плохая идея!
T4NK3R
11

Если у вас есть поддержка php, вы можете сделать что-то вроде этого:

<img src="scriptname.php">

И скрипт name.php:

<?php
header("Content-type: image/png");
// Your email address which will be shown in the image
$email    =    "you@yourdomain.com";
$length    =    (strlen($email)*8);
$im = @ImageCreate ($length, 20)
     or die ("Kann keinen neuen GD-Bild-Stream erzeugen");
$background_color = ImageColorAllocate ($im, 255, 255, 255); // White: 255,255,255
$text_color = ImageColorAllocate ($im, 55, 103, 122);
imagestring($im, 3,5,2,$email, $text_color);
imagepng ($im);
?>
Matias
источник
1
вместо того, чтобы использовать php, вы можете физически создать образ. И, как и в случае с инвертированием CSS, у вас все еще есть проблема не быть кликабельным, и его нельзя скопировать, если не использовать ручку: P
Claudiu
9

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

Все, что легко читается машиной, будет легко читаться машиной спамерами. Хотя их действия кажутся нам глупыми, они не глупые люди. Они инновационные и находчивые. Они не просто используют ботов для сбора электронной почты, у них есть множество методов, и в дополнение к этому, они просто платят за хорошие свежие списки электронных писем. Это означает, что они получили тысячи хакеров по всему миру для выполнения своей работы. Люди, готовые кодировать вредоносные программы, которые очищают экраны браузеров других людей, что в конечном итоге делает любой метод, который вы пытаетесь достичь, бесполезным. Эту ветку уже прочитали более 10 таких людей, и они смеются над нами. Некоторым из них может быть даже скучно до слез, чтобы понять, что мы не можем бросить им новый вызов.

Имейте в виду, что в конечном итоге вы пытаетесь сэкономить не время, а время других. Из-за этого, пожалуйста, подумайте о том, чтобы провести здесь дополнительное время. Нет простой в исполнении волшебной пули, которая бы работала. Если вы работаете в компании, которая публикует на сайте 100 электронных писем, и вы можете уменьшить количество спам-сообщений в день на человека, мы говорим о 36500 спам-писем в год. Если удаление такой электронной почты занимает в среднем 5 секунд, мы говорим о 50 рабочих часах в год. Не говоря уже о сниженной сумме раздражения. Итак, почему бы не потратить несколько часов на это?

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

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

Я потратил около 20 минут, чтобы кодировать пример того, что я имею в виду. В этом примере я использовал KnockoutJS просто потому, что он мне нравится, и я знаю, что вы, вероятно, не будете его использовать сами. Но это все равно не имеет значения. Это нестандартное решение, которое широко не используется. Взломать его не будет вознаграждением за это, так как метод его работы будет работать только на одной странице в огромном Интернете.

Вот скрипка: http://jsfiddle.net/hzaw6/

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

И да, я знаю, что это не работает в IE = lte8 из-за «Невозможно получить атрибуты свойства» с неопределенной или нулевой ссылкой », но мне просто все равно, потому что это просто демонстрация метода, а не фактическая реализация, и не предназначен для использования на производстве как есть. Не стесняйтесь писать свой код, который круче, технически более надежен и т. Д.

О, и никогда не назови что-нибудь mail или email в html или javascript. Просто слишком легко поцарапать DOM и объект окна для чего-либо с именем mail или email и проверить, содержит ли оно что-то, совпадающее с электронной почтой. Вот почему вам никогда не нужны переменные, которые бы содержали электронную почту в ее полной форме, и именно поэтому вы хотите, чтобы пользователь взаимодействовал со страницей, прежде чем назначать такие переменные. Если ваша объектная модель javascript содержит какие-либо адреса электронной почты в состоянии готовности DOM, вы предоставляете их спамерам.

HTML:

<div data-bind="foreach: contacts">
    <div class="contact">
        <div>
            <h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
            <ul>
                <li>Phone: <span data-bind="text: phone"></span></li>
                <li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
            </ul>
        </div>
    </div>
</div>

JS

function ViewModel(){
    var self = this;

    self.contacts = ko.observableArray([
        { firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
        { firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
        { firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
    ]);
    self.msgMeToThis = ko.observable('');
    self.reveal = function(m, e){
        var name = e.target.attributes.href.value;
        name = name.replace('#', '');
        self.msgMeToThis(name);
    };
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
Яни Хюйтяйнен
источник
8

Один из моих любимых методов - скрыть адрес электронной почты с помощью php, классический пример - преобразовать символы в значения HEX следующим образом:

function myobfiscate($emailaddress){
 $email= $emailaddress;                
 $length = strlen($email);                         
 for ($i = 0; $i < $length; $i++){                
 $obfuscatedEmail .= "&#" . ord($email[$i]).";";
 }
 echo $obfuscatedEmail;
}

И тогда в моей разметке я просто назову это следующим образом:

  <a href="mailto:<?php echo myobfiscate('someone@somewhere.com'); ?>"
title="Email me!"><?php echo myobfiscate('someone@somewhere.com');?> </a>

Тогда изучите свой источник, вы будете приятно удивлены!

SimonDowdles
источник
Это хороший пример. Спасибо. Любой ключ к SpamBots, используя HEX-декодирование?
jasonflaherty
7

Вы можете попытаться скрыть символы, используя html-объекты в гекса (например, & # x40 для @). Это удобное решение, так как правильный браузер переведет его, и вы можете иметь нормальную ссылку. Недостаток в том, что бот может перевести это теоретически, но это немного необычно. Я использую это для защиты своей электронной почты в своем блоге.

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

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

Ваше решение довольно хорошее , так как вы добавляете недостаток (пишите вручную @) только для пользователей, у которых отключен JavaScript. Вы также можете быть более безопасными с:

onclick="this.href='mailto:' + 'admin' + '&#x40;' + 'domain.com'"
ofaurax
источник
5

Спам-боты не будут это интерпретировать, потому что это менее известный метод :)

Сначала определите CSS:

email:before {
    content: "admin";
}

email:after {
    content: "@example.com";
}

Теперь, где бы вы ни хотели отобразить свою электронную почту, просто вставьте следующий HTML-код:

<div id="email"></div>

И тада!

Аарон Исав
источник
Это работает, но не поддерживает копирование, что может повлиять на удобство использования для большинства пользователей
Ируку Кагика
4

Я использую очень простую комбинацию CSS и jQuery, которая правильно отображает адрес электронной почты для пользователя, а также работает при щелчке или наведении на якорь:

HTML:

<a href="mailto:me@example.spam" id="lnkMail">moc.elpmaxe@em</a>

CSS:

#lnkMail {
    unicode-bidi: bidi-override;
    direction: rtl;
}

JQuery:

$('#lnkMail').hover(function(){
    // here you can use whatever replace you want
    var newHref = $(this).attr('href').replace('spam', 'com');
    $(this).attr('href', newHref);
});

Вот рабочий пример.

Серджиу
источник
будет ли отображаться правильное значение href в строке состояния браузера при наведении ссылки?
Ник О'Лай
Да, он показывает правильное значение href при наведении ссылки. Вот почему метод jQuery .hover должен быть реализован.
Серджиу
К сожалению, нет, он не показывает правильное значение href, по крайней мере, когда вы наводите указатель мыши на ссылку в первый раз (это me@example.spam). На втором зависании все было ок. Протестируйте это с помощью собственной ссылки.
Ник О'Лай
1
Работает в Chrome и IE. Похоже, только на Firefox, при первом наведении, строка состояния не обновляется. Я постараюсь найти решение для Firefox.
Серджиу
1
Понятно, мне действительно нравится этот.
Эрик Бишард
3

! - Добавляя это для справки, не знаю, насколько устаревшей может быть информация, но она рассказывает о нескольких простых решениях, которые не требуют использования каких-либо сценариев

После поиска этого я сам наткнулся на эту страницу, а также на эти страницы:

http://nadeausoftware.com/articles/2007/05/stop_spammer_email_harvesters_obfuscating_email_addresses

попробуйте поменять адрес электронной почты

Пример простого HTML:

<bdo dir="rtl">moc.elpmaxe@nosrep</bdo>
Result : person@example.com

Тот же эффект, используя CSS

CSS:
.reverse { unicode-bidi:bidi-override; direction:rtl; }
HTML:
<span class="reverse">moc.elpmaxe@nosrep</span>
Result : person@example.com

Сочетание этого с любым из ранее упомянутых методов может даже сделать его более эффективным

Иоганн де Врис
источник
3

Одним из простых решений является использование HTML-сущностей вместо реальных символов. Например, «me@example.com» будет преобразован в:

<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">email me</A>
Ромэн Линсолас
источник
2
Попробуйте google.se/search?q=HTML+entities+converter, который должен вас занять;)
grapefrukt
1
Google может найти много страниц для этого. Один пример: hp.vector.co.jp/authors/VA022023/javascript/…
Ромен Линсолас,
4
Но не мог ли бот так же легко это отразить?
gargantuan
20
О, пример me @ stack ... лучше записать как me@example.com, me@example.net или me@example.org - это единственные доменные имена, которые не владельцы должны использовать в примерах!
Арджан
4
Не так эффективно, согласно techblog.tilllate.com/2008/07/20/…
Fuhrmanator
3

Вот моя рабочая версия:


Создайте где-нибудь контейнер с резервным текстом:

<div id="knock_knock">Activate JavaScript, please.</div>

И добавьте внизу DOM (относительно рендеринга) следующий фрагмент:

<script>
  (function(d,id,lhs,rhs){
    d.getElementById(id).innerHTML = "<a rel=\"nofollow\" href=\"mailto"+":"+lhs+"@"+rhs+"\">"+"Mail"+"<\/a>";
  })(window.document, "knock_knock", "your.name", "example.com");
</script>

Добавляет сгенерированную гиперссылку в указанный контейнер:

<div id="knock_knock"><a rel="nofollow" href="your.name@example.com">Mail</a></div>

Кроме того, вот сокращенная версия:

<script>(function(d,i,l,r){d.getElementById(i).innerHTML="<a rel=\"nofollow\" href=\"mailto"+":"+l+"@"+r+"\">"+"Mail"+"<\/a>";})(window.document,"knock_knock","your.name","example.com");</script>
Darius
источник
2

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

Опция JavaScript не будет работать долго, потому что есть много сканеров, интерпретирующих JavaScript.

Там нет ответа, имхо.

guerda
источник
Есть ли сканеры, интерпретирующие JavaScript? Мой единственный метод кодирования JavaScript, казалось, работал хорошо для меня в течение последних нескольких лет - мой уровень спама был довольно устойчивым ~ 4 в неделю, поэтому я не беспокоился об адресах других людей, которые я доверил этому методу. Нужно ли мне?
Кев
Конечно, это может исключить множество сканеров, но я, если бы я создал сканер адресов, я бы реализовал JavaScript lib :)
guerda
больше усилий, чем вы думаете
анонимный трус
Гугл ползет через какой-то JS.
Алистер Булман
2

Есть, вероятно, боты, которые распознают [at]и другие маскировки как@ символы. Так что это не очень эффективный метод.

Конечно, вы можете использовать некоторые кодировки, такие как URL-кодирование или ссылки на символы HTML (или оба):

// PHP example
// encodes every character using URL encoding (%hh)
function foo($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('%%%X', ord($str[$i]));
    return $retVal;
}
// encodes every character into HTML character references (&#xhh;)
function bar($str) {
    $retVal = '';
    $length = strlen($str);
    for ($i=0; $i<$length; $i++) $retVal.=sprintf('&#x%X;', ord($str[$i]));
    return $retVal;
}

$email = 'user@example.com';
echo '<a href="'.bar('mailto:?to=' . foo(','.$email.'')).'">mail me</a>';

// output
// <a href="&#x6D;&#x61;&#x69;&#x6C;&#x74;&#x6F;&#x3A;&#x3F;&#x74;&#x6F;&#x3D;&#x25;&#x32;&#x43;&#x25;&#x37;&#x35;&#x25;&#x37;&#x33;&#x25;&#x36;&#x35;&#x25;&#x37;&#x32;&#x25;&#x34;&#x30;&#x25;&#x36;&#x35;&#x25;&#x37;&#x38;&#x25;&#x36;&#x31;&#x25;&#x36;&#x44;&#x25;&#x37;&#x30;&#x25;&#x36;&#x43;&#x25;&#x36;&#x35;&#x25;&#x32;&#x45;&#x25;&#x36;&#x33;&#x25;&#x36;&#x46;&#x25;&#x36;&#x44;">mail me</a>

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

гумбо
источник
Полностью согласен, спаммеры - это «умные» люди, после многих лет добавления [at] или [dot] вместо синтаксиса, конечно, у них будут алгоритмы, которые подберут эти шаблоны.
SimonDowdles
Как насчет декодирования этих значений HEX?
Джейсонфлаэрти
2

Я фанат SpamSpan - он запутан, но все еще расшифрован, если JS отключен. Кажется, это тоже работает, хотя я использую его только около года на сайте с низким трафиком.

Существует также модуль для Drupal, который автоматически превращает электронные письма в SpamSpans, если вам это нужно.

Роман Старков
источник
1

Работает ли это, если я щелкну правой кнопкой мыши по ссылке и выберу «Копировать URL»? Если нет, то это очень не идеальная ситуация (я очень редко нажимаю на ссылку mailto, предпочитая копировать адрес электронной почты и вставлять его в мое почтовое приложение или в любое другое место, где он мне нужен в определенный момент времени).

Раньше я довольно параноидально защищал свой почтовый адрес в сети (UseNet, web и т. П.), Но в наши дни я подозреваю, что на самом деле генерируется больше «возможных целей для спама», сопоставляя локальные части с доменами программным путем. Я основываю это на том, что иногда просматриваю логи моего почтового сервера. Как правило, существует довольно много попыток доставки по несуществующим адресам (включая усеченные версии спам-приманки, которые я вешал на UseNet еще в конце 90-х, когда было очень распространено извлечение адресов).

Vatine
источник
1

после того, как я использовал много методов, я нашел простой способ и очень дружелюбный, боты ищут @ Símbolo, и недавно они ищут [at] ant, и это вариация, поэтому я использую 2 техники

  1. я пишу свою электронную почту на изображении, как использование domaintolls, и он работает отлично или
  2. заменить символ (@) изображением

@ заменить и изображение alt будет alt = "@", поэтому бот найдет изображение, и любой человек увидит его как обычный адрес, поэтому, если он скопирует его, он скопирует электронное письмо, и задание будет отложено, поэтому код будет

<p>myname<img src="http://www.traidnt.net/vb/images/mail2.gif" width="11" height="9" alt="@" />domain.com</p>
Абдалла Мохамед Али Ибрагим
источник
1

Существует PHP-скрипт с открытой лицензией, который выводит javascript, который кодирует почту: http://www.maurits.vdschee.nl/php_hide_email/ . Затем вы можете легко вызвать функцию php, указав конкретную почту в качестве аргумента.

Fanky
источник
1

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

Во-вторых, один из способов реализовать безопасную функцию - держаться подальше от <button>тега. Этот тег требует вставки текста между тегами, что делает его читаемым на компьютере. Вместо этого попробуйте <input type="button">с обработчиком JavaScript для onClick. Затем используйте все методы, упомянутые другими, чтобы реализовать безопасную запись электронной почты.

Еще одним вариантом является наличие кнопки «Нажмите, чтобы увидеть адрес электронной почты». После нажатия это превращается в закодированное письмо (символы в кодах HTML). При повторном нажатии это перенаправляет на функцию «mailto: email»

Не закодированная версия последней идеи с выбираемыми и не выбираемыми адресами электронной почты:

<html>
<body>
<script type="text/javascript">
      e1="@domain";
      e2="me";
      e3=".extension";
email_link="mailto:"+e2+e1+e3;
</script>
<input type="text" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="text" onClick="this.value=email;" value="Click for mail-address"/>
<input type="button" onClick="this.onClick=window.open(email_link);" value="Click for mail"/>
<input type="button" onClick="this.value=email;" value="Click for mail-address"/>
</body></html>

Посмотрите, хотите ли вы этого, и объедините это с идеями других. Вы никогда не можете быть слишком уверены.

xaddict
источник
2
о, смотрите - me@domain.extension - есть адрес электронной почты в виде простого текста.
Алистер Булман
1

И моя функция. Я создал его, глядя на ответы, размещенные в этой теме.

 function antiboteEmail($email)
 {
        $html = '';

        $email = strrev($email);
        $randId = rand(1, 500);

        $html .= '<span id="addr-'.$randId.'" class="addr">[turn javascript on to see the e-mail]</span>';
        $html .= <<<EOD
                <script>
                $(document).ready(function(){

                    var addr = "$email";
                    addr = addr.split("").reverse().join("");
                    $("#addr-$randId").html("<a href=\"mailto:" + addr + "\">" + addr + " </a>");
                });
                </script>
EOD;

        return $html;
    }

Он использует два метода: справа налево dir и javascript.

PAM
источник
1

Вариант 1: разделите адрес электронной почты на несколько частей и создайте массив на основе JavaScript из этих частей. Затем соедините эти части в правильном порядке и используйте свойство .innerHTML, чтобы добавить адрес электронной почты на веб-страницу.

 <span id="email">  </span>   // blank tag

 <script>
 var parts = ["info", "XXXXabc", "com", "&#46;", "&#64;"];
 var email = parts[0] + parts[4] + parts[1] + parts[3] + parts[2];
 document.getElementById("email").innerHTML=email; 
 </script>

Вариант 2: использовать изображение вместо текста электронной почты

Сайт создателя изображения из текста: http://www.chxo.com/labelgen/

Вариант 3: мы можем использовать AT вместо «@» и DOT вместо «.»

т.е.

 info(AT)XXXabc(DOT)com 
saun4frsh
источник
1
Я думаю, что вариант 1 не является хорошим вариантом. Парсер, работающий рядом с ботом, может легко определить значение innerHTML, и вариант 3, вероятно, тоже не очень хорош, потому что умный бот может понять это. Я думаю, что вариант 2 является лучшим.
Джон Сондерсон
1

Я не люблю смешивать JavaScript и HTML, поэтому я использую это решение. На данный момент у меня работает нормально.

Идея : вы можете сделать это более сложным, предоставив зашифрованную информацию в data-attributes и расшифровав ее в JS. Это просто сделать, заменив буквы или просто поменяв их местами.

HTML :

<span class="generate-email" data-part1="john" data-part2="gmail" data-part3="com">placeholder</span>

JS :

$(function() {
    $('.generate-email').each(function() {
        var that = $(this);
        that.html(
            that.data('part1') + '@' + that.data('part2') + '.' + that.data('part3')
        );
    });  
});

Попробуйте это: http://jsfiddle.net/x6g9L817/

Мистер Б.
источник
1

как насчет HTML_CHARACTER ?:

joe&#064;mail.com

выходы

joe@mail.com
оборота тазо тодуа
источник
1
В этом случае адрес электронной почты не реагирует на нажатия, и размещение символа @ не будет пуленепробиваемым, поскольку оно не всегда будет выглядеть так же, как если бы оно было встроено.
Брент О'Коннор
0

Вот простое решение этой проблемы с помощью jquery:

<script type="text/javascript">
$(document).ready(function() {
    str1="mailto:";
    str2="info";
    str3="@test.com";
    $("#email_a").attr("href", str1+str2+str3);

});
</script>

<a href="#" id="email_a"><img src="sample.png"/></a>
Haluk
источник
0

Мне больше всего нравится ответ ofaurax, но я бы изменил его для более скрытого письма:

onclick="p1='admin'; p2='domain.com'; this.href='mailto:' + p1 + '& #x40;' + p2"
Донни
источник
0

Я просто должен дать другой ответ. Я просто придумал что-нибудь интересное, чтобы поиграть.

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

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

var str = 'john.doe@email.com';
str = str.toLowerCase().replace(/[\.@a-z]/gi, function(match, position, str){
    var num = str.charCodeAt(position);
    return ('&#' + (num + 65248) + ';');
});

Вот рабочая скрипка: http://jsfiddle.net/EhtSC/8/

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

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

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

Вероятно, не самый безопасный подход, но мне действительно было весело играть с ним: D

Яни Хюйтяйнен
источник