Защита от ботов средствами PHP и JavaScript
Не секрет, что, размещая в открытом виде на сайтах свои 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;
|
|