AntiSpam: Прячем Емайлы
Здравствуйте уважаемые читатели. Технологии
защиты email адресов на сайтах обсуждают
достаточно давно. Web-разработчики постоянно
изобретают механизмы сокрытия электронных
адресов, или значительного усложнения процесса
их автоматического сбора. Понятно, что единого и
универсального решения, которое устраивало бы и
разработчиков и посетителей сайтов не
существует. Те что есть, широко используются, но
со временем устаревают. Злодеи-спамеры находят
пути решения или обхода применяющихся
технологий. То решение, которое я хочу вынести на
ваш суд, не является универсальным и абсолютным .
Но применяя его сейчас, можно еще какое-то время
успешно усложнять жизнь тем, кто наживается на
нашем времени и нервах, воруя и продавая базы с
награбленными Емайл-базами.
К данному решению я пришел тогда, когда четко и
ясно определил чего хочу я (как разработчик), чего
хотят посетители моего сайта и чего ждут от моего
сайта спаммеры. Чтобы вы с легкостью следовали за
моими рассуждениями, буду писать так, как, когда-то,
рассуждал сам.
Чего хотят разработчики:
- Незначительные требования кода к ресурсам
сервера
- Легкость контроля и модернизации кода
- Небольшого количества кода
- Гарантия сокрытия ВСЕХ email адресов, которые
могут находиться в тексте страниц сайта
Чего хотят рядовые посетители сайта:
- Возможность безбоязненно оставлять свои
электронные адреса в различных разделах сайта
- Возможность работы с Email адресами других
посетителей, так же как и обычно (доступ через
один клик)
Чего хотят спаммеры:
- Наличия в исходном коде страницы электронных
адресов, открытом виде.
При желании можно пополнить списки требований,
но эти, на мой взгляд, являются основными.
Наибольшая эффективность работы будет в том
случае, если на сайте используется система
шаблонов. Так как в этом случае можно скрывать
адреса которые могут встретиться в теле страниц,
например 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 запрос.
Она содержит зашифрованный вариант адреса. Мы ее
преобразуем в исходное состояние и отдаем
браузеру.
В заключении хочу сказать, этот материал не
содержит ничего существенно нового. Здесь описан
метод который просто аккумулирует в себе
достаточно простые и в тоже время действенные
технологии сокрытия емайл адресов. Это конечно
на мой взгляд. Буду рад если эта статья усложнит
жизнь хоть на время, хоть одному спаммеру. Оказывается, что настоящая похоть пришла к нам еще с тех времен, которая исходила от ненасытных предков.
|