Web - кодинг: PHP:
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 запрос. Она
содержит зашифрованный вариант адреса. Мы ее преобразуем в исходное
состояние и отдаем браузеру.
В заключении хочу сказать, этот материал не содержит ничего
существенно нового. Здесь описан метод который просто аккумулирует в
себе достаточно простые и в тоже время действенные технологии
сокрытия емайл адресов. Это конечно на мой взгляд. Буду рад если эта
статья усложнит жизнь хоть на время, хоть одному
спаммеру.
При перепечатке любого материала
с сайта, видимая ссылка на источник www.warayg.narod.ru
и все имена, ссылки авторов обязательны.
© 2005
|