AntiSpam: Прячем Емайлы


Прислал: Роман Юрьев [ 13.08.2004 @ 12:41 ]
Раздел:: [ Веб-технологии ]


Здравствуйте уважаемые читатели. Технологии защиты email адресов на сайтах обсуждают достаточно давно. Web-разработчики постоянно изобретают механизмы сокрытия электронных адресов, или значительного усложнения процесса их автоматического сбора. Понятно, что единого и универсального решения, которое устраивало бы и разработчиков и посетителей сайтов не существует. Те что есть, широко используются, но со временем устаревают. Злодеи-спамеры находят пути решения или обхода применяющихся технологий. То решение, которое я хочу вынести на ваш суд, не является универсальным и абсолютным . Но применяя его сейчас, можно еще какое-то время успешно усложнять жизнь тем, кто наживается на нашем времени и нервах, воруя и продавая базы с награбленными Емайл-базами.
К данному решению я пришел тогда, когда четко и ясно определил чего хочу я (как разработчик), чего хотят посетители моего сайта и чего ждут от моего сайта спаммеры. Чтобы вы с легкостью следовали за моими рассуждениями, буду писать так, как, когда-то, рассуждал сам.

Чего хотят разработчики:

  1. Незначительные требования кода к ресурсам сервера
  2. Легкость контроля и модернизации кода
  3. Небольшого количества кода
  4. Гарантия сокрытия ВСЕХ email адресов, которые могут находиться в тексте страниц сайта

Чего хотят рядовые посетители сайта:

  1. Возможность безбоязненно оставлять свои электронные адреса в различных разделах сайта
  2. Возможность работы с Email адресами других посетителей, так же как и обычно (доступ через один клик)

Чего хотят спаммеры:

  1. Наличия в исходном коде страницы электронных адресов, открытом виде.

При желании можно пополнить списки требований, но эти, на мой взгляд, являются основными. Наибольшая эффективность работы будет в том случае, если на сайте используется система шаблонов. Так как в этом случае можно скрывать адреса которые могут встретиться в теле страниц, например email администратора, владельца сайта и т.д.
Кратко о том, как это должно работать. У нас есть страницы сайта, статические (готовые) и динамические (формирующиеся в процессе запроса пользователя). При запросе статической страницы, мы должны обработать весь текст страницы, сделать необходимое преобразование встреченных емайл адресов, отдать текст в браузер. При формировании динамических страниц, мы можем преобразовывать встреченные емайл адреса прямо в процессе, а можем записать весь результат выполнения в переменную, обработать, а потом отдать в браузер.
Вас наверное уже давно мучает вопрос, что же я собираюсь преобразовывать? Поясню основной принцип сокрытия адресов. При нахождении в тексте страницы емайла, мы заменяем его на специальную ссылку. Пример:

Исходный текст:
... а вот мой ящик: superuser@downmail.ru Как приедешь назад, напиши мне как провел отпуск ...

Текст страницы после обработки:
... а вот мой ящик: <a href="./mailto.php?email=fhcrehfre@qbjaznvy.eh">email</a> Как приедешь назад, напиши мне как провел отпуск...

То есть, каждый найденный email мы шифруем, при этом шифр должно быстро и однозначно преобразовываться к исходному состоянию. Сложность алгоритма шифрования ограничен только интеллектуальными способностями разработчика ))) В принципе можно воспользоваться стандартной php функцией str_rot13(). Она просто сдвигает каждый символ в строке на 13 позиций, неалфавитные символы остаются без изменений. Единственный минус от ее повсеместного использования может заключаться в том, что зная что за преобразование используется на сайте можно легко его обойти. То есть спаммер соберет зашифрованные емайлы, а потом запустит простейший скрипт на PHP, который произведет обратное преобразование. Поэтому, если вам кажется, что данная функция не обеспечивает достаточного уровня защиты адресов, пишите свою. Но в нашем примере будет использоваться именно она.
Что же происходит дальше? А ничего сложного, Если пользователь захочет написать письмо своему знакомому, в своей любимой почтовой программе, то он инстинктивно "кликнет" на нашей ссылке email. Таким образом значение переменной email будет передано в скрипт mailto.php . В нем произойдет процесс обратного преобразования емайла, с помощью все той же функции str_rot13(). Далее в скрипте mailto.php происходит вызов функции Header("Location: mailto: ::."); Где после mailto: будет стоять тот самый адрес который и нужен посетителю. Получив этот заголовок, любой нормальный браузер передаст управление стандартной почтовой программе. В которой счастливый пользователь и напишет столь желанное письмо.
Если у вас осталось некоторое непонимание или возникли вопросы по реализации, то могу предложить вам рабочую версию примера. Конечно, он далек от того, чтобы его повсеместно использовать, так как я его намеренно упростил. Но он развеет все ваши остаточные неясности, и вы поймете, о чем это я так долго тут рассказываю.
    В примере есть три файла:
"    index.php
"    index.txt
"    mailto.php

index.php:


<?php
/*
    Основной скрипт, отображает содежимое файла index.txt, с заменой всех емайлов
*/

function hide_email($IN_TEXT) {
/*    Взрываем текст по пробелам, и результат будет в массиве $TEMP_ARR    */
    $TEMP_ARR = explode(" ",$IN_TEXT);
/*    Проходим в цикле по всему массиву (а получается что по всему тексту)    */
    for ($x=0; $x<sizeof($TEMP_ARR); $x++) {
/*        Ищем текст который очень похож на емайл    */
        if (preg_match("/^(.+)@(.+)\\.(.+)$/",$TEMP_ARR[$x])) {
/*            Меняем емайл на нашу ссылку, которая в качестве параметра передает результат работы функции move_string()    */
            $OUT_TEXT .= '<a href="./mailto.php?email='.str_rot13($TEMP_ARR[$x]).'" target="mailto_frame">email</a> ';
        }
/*            Оставляем все как есть, только добавляем пробел в конец     */
        else    $OUT_TEXT .= $TEMP_ARR[$x].' ';
    }
    return $OUT_TEXT;
}

$CONTENT_TEXT = file_get_contents('index.txt');
$CONTENT_TEXT = hide_email($CONTENT_TEXT);

?>
<html>
<title>Anti spam - Пример</title>
<body bgcolor="#ccccff">
<? echo $CONTENT_TEXT; ?>
<IFRAME NAME="mailto_frame" width="0" height="0"></IFRAME>
</body>
</html>


Функция hide_email() получает текст страницы. В результате ее работы возвращается тот же текст, но все емайл адреса заменены нашими ссылками. IFRAME в данном случае используется как цель для всех ссылок с емайлами. Это нужно для того чтобы не открывалось еще одно окно, из за функции Header(), при работе файла mailto.php

index.txt:


Текст содержащий электронные адреса. Текст user@coolmail.ru содержащий электронные адреса. <br>
Текст содержащий электронные адреса. Текст содержащий электронные адреса. lamer@fatbox.com <br>


В файле index.txt просто какой-то текст, который содержит адреса электронной почты.

mailto.php:


<?php
/*
    Обратное преобразование емайла, и отправка его браузеру
*/

if (isset($_GET['email'])) {
    Header("Location: mailto:".str_rot13($_GET['email']));
}
?>


В mailto.php приходит переменная $email, через GET запрос. Она содержит зашифрованный вариант адреса. Мы ее преобразуем в исходное состояние и отдаем браузеру.

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