WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Защита от ботов средствами PHP и JavaScript


Прислал: Александр Ершов [ 10.05.2007 @ 15:32 ]
Раздел:: [ Статьи по PHP ]


Не секрет, что, размещая в открытом виде на сайтах свои e-mail и icq адреса, мы рискуем попасть в списки спамеров и стать получателями нежелательной информации. Как же защитить информацию от ботов, в то же время сделав ее доступной для рядовых пользователей? Для этого существует множество способов. В этой статье будут рассмотрены два из них:
  • Защита с помощью размещения текста на изображении
  • Защита с помощью JavaScript
Рассмотренные примеры, однако, не претендуют на полноту охвата затронутой проблемы, и при необходимости могут быть легко дополнены для соответствующего использования.

Защита с помощью размещения текста на изображении

Предположим, нам нужно разместить номер icq и контактный e-mail. Пишем следующий код:

// Строка с e-mail адресом
$email="E-mail: user@site.ru";
// Строка с ICQ
$icq="ICQ: 123456";
// Создаем изображение с помощью библиотеки GD шириной 200 и высотой 30 пикселей
$im = imagecreate(200, 30);
// Задаем белый цвет (для фона)
$bg = imagecolorallocate($im, 255, 255, 255);
// Задаем черный цвет для шрифта
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);
// Задаем размер шрифта
$size=4;
// Делаем белый цвет прозрачным
imagecolortransparent($im,$bg);
// Наносим надписи на изображение
imagestring($im,$size,0,0,$email,$black);
imagestring($im,$size,0,15,$icq,$black);
// Посылаем браузере заголовок о выводе изображения
header('Content-type: image/png');
// Выводим изображение в формате PNG
imagepng($im);


Сохраняем полученный файл, допустим, как img_contacts.php, а в нужном нам документе вызываем так:
<img src='img_contacts.php' border='0' alt='Контактная информация'>.
Так как изображение прозрачно, его можно размещать поверх любого фона.

Защита с помощью размещения текста на изображении

Идея такая - на стороне сервера разбиваем защищаемую строку (это может быть просто текст, а может быть и HTML код) на случайные кусочки. Затем создаем JavaScript, в котором будет некоторое число переменных со случайными именами. Каждая такая переменная содержит кусочек исходного текста. Объединяем их в одну строку и выводим с помощью document.write().
Код выглядит следующим образом:

// Функция генерации случайного набора символов
function rnd_string() {
    // Из каких символов будет собирать строку
    $textCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // Переменная для хранения строки
    $string = "";
    // Выбираем случайную длину от 5 до 10
    $stringLength=mt_rand(5,10);
    // Составляем строку
    while(strlen($string) < $stringLength) {
    $string .= substr($textCharacters, mt_rand(0,strlen($textCharacters)-1),1);
    }
    return $string;
    }
// Защищаемая строка, в нашем случае - HTML код контакной информации
$contact_info='E-mail:<a href="mailto:user@site.ru">user@site.ru</a><br>ICQ: 123456';
// Максимальное число кусочков, из расчета что в минимальном по длине содержится 3 символа
$max_slices=ceil(strlen($contact_info)/3);
// Создаем массив, содержащий случайные имена переменных JavaScript
for($i=0;$i<$max_slices;$i++) {
    $rnd_strs[$i]=rnd_string();
    }
// Переменная для хранения защитного скрипта
$antispam="<script language='JavaScript'><!--\n";
// Текущее число символов, выбираемых из защищаемой строки
$current=0;
// Начальная позиция, с которой выбираем $current символов в цикле
$last=0;
// Разделяем защищаемую строку на случайные кусочки
for($i=0;$i<$max_slices;$i++) {
    // Случайное число символов
    $current=mt_rand(3,7);
    // Отделяем от исходной строки
    $temp=substr($contact_info,$last,$current);
    // Добавляем к выходному коду
    $antispam.=$rnd_strs[$i]."='".$temp."';";
    // Для следующей итерации цикла сохраняем значение конца текущего снятого куска исходной строки
    $last=$last+$current;
    }
// Код JavaScript для вывода в браузер
$antispam.="document.write(";
// Код JavaScript для объединения строк
for($i=0;$i<$max_slices;$i++) {
    $antispam.=$rnd_strs[$i]."+";
    }
$antispam.="'');\n//-></script>";
// Выводим в браузер
echo $antispam;
    



 :::::  Сергей пишет 18.05.2007 @ 11:51 
Также можно шифровать адреса email в Smarty с помощью функции mailto. Подробное описание функции можно найти тут [ http://smarty.php.net/manual/en /language.function.mailto.php], я же просто приведу несколько примеров ее использования:

1) В шаблоне размещен тег:
{mailto address="email@box.com"}
после обработки шаблона получим следующий код:
<a href="mailto:email@box.com" >email@box.com</a>

2) В шаблоне размещен тег:
{mailto address="email@box.com" encode="javascript"}
после обработки шаблона получим следующий код:
<script type="text/javascript">
eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%65%6d%61%69%6c%40%62%6f%78%2e%63%6f%6d%22%20%3e%65%6d%61%69%6c%40%62%6f%78%2e%63%6f%6d%3c%2f%61%3e%27%29%3b'))
</script>

3) В шаблоне размещен тег:
{mailto address="email@box.com" encode="javascript_charcode"}
после обработки шаблона получим следующий код:
<script type="text/javascript" language="javascript">
<!--
{document.write(String.fromCharCode(60,97,32,104,114,101,102,61,34,109,97,105,108,116,111,58,101,109,97,105, 108,64,98,111,120,46,99,111,109,34,32,62,101,109,97,105,108,64,98,111,120,46,99,111,109,60,47,97,62))}
//-->
</script>

4) В шаблоне размещен тег:
{mailto address="email@box.com" encode="javascript_charcode"}
после обработки шаблона получим следующий код:
<a href="mailto:%65%6d%61%69%6c@%62%6f%78. %63%6f%6d" >email@box.com</a>
 :::::  shkur пишет 26.03.2010 @ 19:37 
Все круто. спасибо!
 :::::  shkur пишет 28.03.2010 @ 18:25 
Вот втором скрипте автора надо пред-предпоследнюю строку поправить:
с $antispam.="'');\n//-></script>";
на $antispam.="'');\n//--></script>"; комментарий надо закрывать --> , а не ->

 :::::  Константин пишет 17.06.2013 @ 12:03 
Очень полезная информация, надо взять и сделать все как описывается, чтобы не попасть в недоброжелательный список.
Имя:
Email:
URL

Введите сумму двух чисел семь и шесть (семь+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0273049