Блог старого компьютера

Блог старого компьютера


Главная PHP Делаем простую капчу на PHP

Делаем простую капчу на PHP

26.01.2012 06:19 Администратор PHP
Печать PDF

Сегодня понадобилось сделать капчу для нескольких сайтов один на Joomla другой на Maxsite тут опишу просто код не подстроенный под какой либо двиг. Ибо надоело постоянно вычищать руками спамы и прочую гадость что так любят размещать нерадивые пользователи или же их  спам боты. Буду описывать довольно простую реализацию капчи на PHP, думаю каждый кому надо доработает, усложнит ее как кому угодно.

Хоть капча довольно и простая но отлично спасает от спама. Сама капча для для движка Joomla будет несколько отличаться, но об этом я напишу в разделе посвеященному Joomla.

Собственно начнем творить.  Для начала создадим 2 файла, один файл будет отвечать за генерацию/созадние картинки другой будет генерировать и отдавать код который будет отображаться на картинке. Код будем генерировать случайным образом с помощью php функции rand(). Передавать код будем по средствам сессий ($_SESSION).

Один файл назовем number.php, второй файл назовем к примеру index.php. Ниже код обоих с пояснениями.

Файл index.php:

session_start(); // работа с сессиями запущена
$rand = rand(100,999); //герерируем случайное число в диапазоне
$_SESSION['number'] = $rand; // создаем запись в сессиях
echo '<img src="/number.php" />'; // выводим картинку

 Файл number.php:

session_start(); // сесии
$number = $_SESSION['number']; // получаем случайное число из сессии
$im = imagecreate(30, 18); // создаем картинку с заданным размером
$bg = imagecolorallocate($im, 237, 103, 43); // закрашиваем фон
$text_color = imagecolorallocate($im, 255, 255, 255); // задаем цвет которым будем писать
imagestring($im,10,2,1,$number, $text_color); // пишем
Header("Content-type: image/jpeg"); // устанавливаем тип документа
imageJpeg($im);

 Ну вот вроде бы и все, при запуске файла index.php появится картинка с кодом. Но пойдем дальше допишем в код форму и добавим сверку, файл numder.php трогать не будем он у нас полностью готов.

< ?
session_start(); // работа с сессиями
if(!isset($_POST['name'])){
$rand = rand(100,999); //герерируем случайное число в диапазоне
$_SESSION['number'] = $rand; // создаем запись в сессиях
?>
<form action="" method="post">
Ваше имя:<br />
<input type="text" name="name" value="" /><br />
Введите код с картинки:
<img src="/number.php" /><br />
<input type="text" name="number" value="" /><br />
<input type="submit" value="Отправить">
</form>
<?
}
else{
if($_POST['number']==$_SESSION['number']){ // проверяем правильно ли введен код
/*Код введен правильно можно производить необходимые операции*/
echo 'ОК';
}
else{
echo 'ERROR';
}
}
?>

 Добавили форму, добавили проверку код работает, а радоваться еще не пора. Код имеет небольшую но в нашем случае серьезную уязвимость. Если заполнить форму и отправить, а после этого нажать кнопку назад и снова отправить то форма вновь отправится без ошибок и с тем же кодом капчи. Модернизируем наш код дабы избежать этого. Для этого в конец кода добавим строки которые после загрузки страницы запишут новый код в сессии.

Теперь код выглядит так:

  < ?
session_start(); // работа с сессиями
if(!isset($_POST['name'])){
$rand = rand(100,999); //герерируем случайное число в диапазоне
$_SESSION['number'] = $rand; // создаем запись в сессиях
?>
<form action="" method="post">
Ваше имя:<br />
<input type="text" name="name" value="" /><br />
Введите код с картинки:
<img src="/number.php" /><br />
<input type="text" name="number" value="" /><br />
<input type="submit" value="Отправить">
</form>
<?
}
else{
if($_POST['number']==$_SESSION['number']){ // проверяем правильно ли введен код
/*Код введен правильно можно производить необходимые операции*/
echo 'ОК';
}
else{
echo 'ERROR';
}
}
$rand = rand(100,999); // вновь генерируем
$_SESSION['number'] = $rand; // вновь устанавливаем
?>

 Вот собственно и все. Код можете усовершенствовать если вам это требуется и использовать его в своих проектах!

Комментарии  

 
0 #6 Administrator 18.01.2014 10:02
Цитирую *.ZeLanSte.*:
Эта статья довольно таки для новичков.

Естественно!
Цитировать
 
 
0 #5 *.ZeLanSte.* 13.01.2014 18:34
Эта статья довольно таки для новичков.
Цитировать
 
 
0 #4 Administrator 27.09.2013 03:02
Цитирую Лев:
У меня выдает ошибку: Parse error: syntax error, unexpected '}' in /home/u163976011/public_html/index.html on line 41
Помогите пожалуйста!

Php вам говорит что у вас синтаксическая ошибка. Проверьте все ли закрыты фигурные скобки. Так же обратите внимание что открытие php (< ?) в статье с пробелом который нужно убрать.
Цитировать
 
 
0 #3 Лев 06.08.2013 08:31
У меня выдает ошибку: Parse error: syntax error, unexpected '}' in /home/u163976011/public_html/index.html on line 41
Помогите пожалуйста!
Цитировать
 
 
0 #2 Виталий 10.04.2013 01:31
Нормальная статья!
Цитировать
 
 
+2 #1 Юзер Joomla 21.02.2012 11:08
Спасибо огромное! С помощью вашей статьи сделал капчу для онлайн заявки на сайте.... Три дня убил... Joomla - зло!!! ))))))))))))))) ))))
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Поиск

Голосование

Что Вы думаете на счет битрикса?
 

Все материалы раздела