Защищаем адреса электронной почты от ботов на веб-странице?

StackOverflow https://stackoverflow.com/questions/163628

  •  03-07-2019
  •  | 
  •  

Вопрос

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

joe.somebody@company.com

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

Экранирующие символы HTML:

joe.somebody@company.com

Дешифратор Javascript:

function XOR_Crypt(EmailAddress)
{
    Result = new String();
    for (var i = 0; i < EmailAddress.length; i++)
    {
        Result += String.fromCharCode(EmailAddress.charCodeAt(i) ^ 128);
    }
    document.write(Result);
}

XOR_Crypt("êïå®óïíåâïäùÀãïíðáîù®ãïí");

Человеческое Декодирование:

joe.somebodyNOSPAM@company.com

joe.somebody AT company.com

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

Это было полезно?

Решение

Я вообще не беспокоюсь. Я имел обыкновение быть в списке рассылки, который получил несколько тысяч спамов каждый день. Наш спам-фильтр (spamassassin) пропускает 1-2 дня в день. С фильтрами это хорошо, почему законным людям трудно связаться с вами?

Другие советы

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

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

Поэтому вместо того, чтобы искать способ запутывания адресов электронной почты One True, придумайте свой собственный. Рассчитывайте на то, что этим авторам ботов не слишком важно, чтобы ваш сайт писал что-то, чтобы обойти ваши слегка сумасшедшие границы рендеринга text-with-css-and-element-border или ваше совершенно странное, легко взломанное шифрование javascript , Неважно, если это тривиально, никто не будет пытаться обойти это, просто чтобы они могли спамить вас.

Я написал кодировщик ( source ), который использует все возможные приемы синтаксического анализа, которые я мог придумать ( различные виды сущностей HTML, кодирование URL, комментарии, многострочные атрибуты, мягкие дефисы, неочевидная структура mailto: URL и т. д.)

Это не останавливает все харвестеры, но OTOH полностью соответствует стандартам и прозрачно для пользователей.

Еще один хороший ИМХО подход (который вы можете использовать в дополнение к сложному кодированию) заключается в следующем:

<a href="mailto:userhatestogetspam@example.com" 
   onclick="this.href=this.href.replace(/hatestogetspam/,'')">

Вы можете защитить свой адрес электронной почты с помощью reCAPTCHA, они предлагают бесплатную услугу, поэтому люди должны пройти тест CAPTCHA (полностью автоматизированный публичный тест Тьюринга, чтобы сообщить компьютерам и людям отдельно), чтобы увидеть вашу электронную почту: https://www.google.com/recaptcha/admin#mailhide

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

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

HTML:

<a href="#" class="--mailto--john--domain--com-- other classes goes here" />

JavaScript, используя jQuery:

// match all a-elements with "--mailto--" somehere in the class property
$("a[class*='--mailto--']").each(function ()
{
    /*
    for each of those elements use a regular expression to pull
    out the data you need to construct a valid e-mail adress
    */
    var validEmailAdress = this.className.match();

    $(this).click(function ()
    {
        window.location = validEmailAdress;
    });
});

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

A ответ мой ответ на аналогичный вопрос:

Я использую очень простую комбинацию 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);
});

Здесь это рабочий пример.

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

Вместо этого используйте контактную форму. Поместите все ваши адреса электронной почты в базу данных и создайте форму HTML (subject, body, from ...), которая отправляет содержимое электронного письма, которое пользователь заполняет в форме (вместе с идентификатором или именем, которое используется для ищите адрес электронной почты этого человека в вашей базе данных) в сценарии на стороне сервера, который затем отправляет электронное письмо указанному человеку. Адрес электронной почты никогда не подвергается. Возможно, вы захотите внедрить некоторую форму CAPTCHA для предотвращения спам-ботов.

Попробуйте генератор иконок электронной почты. http://services.nexodyne.com/email/

Конечно, есть еще несколько ботов OCR, которые могут получить это ..

Я делаю свою учетную запись whatDOC@whever.com, а затем рядом с ней пишу "Удалить заглавные буквы"

В бесплатном Gmail есть потрясающий фильтр спама.

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

В более сложной ситуации, когда вам нужно показать адрес @ business.com, вы можете указать public@business.com и переслать всю эту почту в учетную запись gmail, которая затем перенаправит ее обратно в реальный @ business. ком

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

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

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

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

Тем не менее, при отображении адресов электронной почты других пользователей на вашем веб-сайте, я думаю, что требуется определенный уровень должной осмотрительности. К счастью, блогер по имени Silvan M & hlemann имеет выполнил всю сложную работу за вас . Он опробовал различные методы запутывания в течение 1,5 лет и определил лучшие из них, большинство из которых включают трюки CSS или JavaScript, которые позволяют правильно отображать адрес в браузере, но могут запутать автоматические скребки.

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

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

Это то, что мы используем (VB.NET):

Dim rxEmailLink As New Regex("<a\b[^>]*mailto:\b[^>]*>(.*?)</a>")
Dim m As Match = rxEmailLink.Match(Html)
While m.Success
    Dim strEntireLinkOrig As String = m.Value
    Dim strEntireLink As String = strEntireLinkOrig
    strEntireLink = strEntireLink.Replace("'", """") ' replace any single quotes with double quotes to make sure the javascript is well formed
    Dim rxLink As New Regex("(<a\b[^>]*mailto:)([\w.\-_^@]*@[\w.\-_^@]*)(\b[^>]*?)>(.*?)</a>")
    Dim rxLinkMatch As Match = rxLink.Match(strEntireLink)
    Dim strReplace As String = String.Format("<script language=""JavaScript"">document.write('{0}{1}{2}>{3}</a>');</script>", _
                RandomlyChopStringJS(rxLinkMatch.Groups(1).ToString), _
                ConvertToAsciiHex(rxLinkMatch.Groups(2).ToString), _
                rxLinkMatch.Groups(3), _
                ConvertToHtmlEntites(rxLinkMatch.Groups(4).ToString))
    Result = Result.Replace(strEntireLinkOrig, strReplace)
    m = m.NextMatch()
End While

и

    Public Function RandomlyChopStringJS(ByVal s As String) As String
        Dim intChop As Integer = Int(6 * Rnd()) + 1
        Dim intCount As Integer = 0
        RandomlyChopStringJS = ""
        If Not s Is Nothing AndAlso Len(s) > 0 Then
            For Each c As Char In s.ToCharArray()
                If intCount = intChop Then
                    RandomlyChopStringJS &= "'+'"
                    intChop = Int(6 * Rnd()) + 1
                    intCount = 0
                End If
                RandomlyChopStringJS &= c
                intCount += 1
            Next
        End If
    End Function

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

<script language="JavaScript">document.write('<a '+'clas'+'s='+'"Mail'+'Link'+'" hr'+'ef'+'="ma'+'ilto:%69%6E%66%6F%40%62%69%63%75%73%61%2E%6F%72%67">&#105;&#110;&#102;&#111;&#64;&#98;&#105;&#99;&#117;&#115;&#97;&#46;&#111;&#114;&#103;</a>');</script>

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

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

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

Спам-боты со временем будут иметь свои собственные движки Javascript и CSS, поэтому я не думаю, что вы должны смотреть в этом направлении.

Вариант 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 вместо " , & Quot;

т.е.

 info(AT)XXXabc(DOT)com 

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

<script type="text/javascript">
    $(function () {
        setTimeout(function () {
            var m = ['com', '.', 'domain', '@', 'info', ':', 'mailto'].reverse().join('');

            /* Set the contact email url for each "contact us" links.*/
            $('.contactUsLink').prop("href", m);
        }, 200);
    });
</script>

Если робот решит эту проблему, нет необходимости добавлять больше "простой логики" код наподобие " if (1 == 1? '@': '') " или добавление элементов массива в другом порядке, поскольку робот в любом случае просто изменяет код.

Прекрасные шрифты!

<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">

<p>myemail<i class="fa fa-at" aria-hidden="true"></i>mydomain.com</p>

http://fontawesome.io/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top