Шифрование e-mail'ов от спамботов

2011-07-07T04:43:48+07:00

Для начала опишу проблему. Надо как-то вставить адрес email на страницу, да ещё так, чтобы посетитель его смог увидеть, а спамбот - нет. Открытым текстом вставлять нельзя, Javascript включён не у всех (например, на мобильных браузерах с ним большие проблемы), картинки легко распознаются. Не капчу же из e-mail’а делать. Но на помощь придёт CSS.

Теория

Во-первых, CSS позволяет вставлять в текст невидимые блоки. Таким образом, можно написать что-то вроде:

Пишите мне на hello@<span class=”ilove”>lisa</span>my<span class=”blank”>home</span><span class=”ihate”>ryan</span>.ru

Пока спамбот не прочешет по всем подключённым стилям страницы и не найдёт, что в классах ilove и ihate прописано display:none, он будет принимать их за выделенную часть URL. Если же он будет фильтровать все HTML теги из того, что он распознал как адрес электронной почты, то он пропустит часть адреса, а именно слово home.

Уже довольно эффективно и (в некоторых браузерах) не ломает копипаст, но можно ещё лучше.

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

<span style=”unicode-bidi: bidi-override; direction: rtl;”>gro.elpmaxe@olleh</span>

В браузере этот код превратится в понятный hello@example.org.

Я написал короткий скрипт на Ruby, который генерирует подобные шифрованные e-mail’ы автоматически. Он обращает введённую строку и случайным образом заполняет её незначащими символами. Предполагается, что класс hidden у вас в стилях помечен как скрытый.

Код на Ruby

#!/usr/bin/ruby puts “Enter email:” email = gets email.reverse! chars = [‘0’..’9’,’a’..’z’,’A’..’Z’].map{ |r| r.toa }.flatten print ‘<span style=”unicode-bidi: bidi-override; direction: rtl;”>’ email.eachchar{|char| print char if (rand(10)>8) then print ‘<span class=”hidden”>’ + chars[rand(chars.size)] + ‘</span>’ end } puts “</span>”

Альтернативное решение

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

Чтобы спрятать ссылку вида Написать Васе Пупкину, можно воспользоваться… сокращателями ссылок. Действительно, некоторые сокращатели не проверяют ссылки на существование или формат. Так, ссылка http://tinyurl.com/6z7zvdk после перехода превращается в адрес mailto:pleasedonotwriteme@example.org, как вы можете убедиться тут.