php Капча: решение текстового примера со сложением или вычитанием, просто 

Дата публикации  Дата изменения19.09.13  КомментарииНет   Просмотры4344

Простой скрипт капчи, которая представит достаточную сложность для автораспознавателей капч и которая может быть заточена в широком диапазоне. Сложение и вычитание выбраны для "ненапряжности" для посетителей и меняются случайным образом; можно применять другие математические действия, в любом сочетании. Использование текстового описания примера также может быть заменено на желаемый вариант – например, на картинки цифр, объектов и т.д. Вообще скрипт очень прост и гибок.

Посетителю предлагается решить пример на сложение или вычитание, причем действие меняется случайным образом и условие примера описывается словами. Результат примера может быть отрицательным, что подразумевает введение знака "минус", а возможность получения нулевого результата исключена, как исключена и возможность повторной отправки одного и того же ответа через обновление страницы.

Подробные объяснения содержатся в теле скрипта; все замечания, предложения, улучшения и комментарии будут восприняты с благодарностью :)

Пример использования:

Капча: решение текстового примера

  • Файл капчи captcha_dig.php:
 <?php
/***********************************************
/* Captcha: addition or subtraction in a text mode script – © «OIS» aka Coder (http://coder.hol.es)
/* This notice MUST stay intact for legal use
/* Visit http://coder.hol.es/ for this script and others.
***********************************************/
$first = rand(0, 10); //получаем случайное значение
$second = rand(0, 10);

 if ($first == $second) {//убираем возможность одинаковости первого и второго числа и исключаем тем самым нулевой результат
 $first = rand(1, 5);
 $second = rand(6, 10);
 }
 
 function mirror ($name, $name_l) //привязываем к выводимой в браузер ($first_l и $second_l) переменной текстовое значение в соответствии с используемой при вычислении 
 {
 switch ($name) {  
case 0:
    $name_l = "ноль"; break;
case 1:
    $name_l = "один"; break;
case 2:
    $name_l = "два"; break;
case 3:
    $name_l = "три"; break;
case 4:
    $name_l = "четыре"; break;
case 5:
    $name_l = "пять"; break;
case 6:
    $name_l = "шесть"; break;
case 7:
    $name_l = "семь"; break;
case 8:
    $name_l = "восемь"; break;
case 9:
    $name_l = "девять"; break;
case 10:
    $name_l = "десять"; break;
}
return $name_l;
 }
 
 $first_l = mirror ($first, $first_l); 
 $second_l = mirror ($second, $second_l);

$t = time();  //инициализируем переменную для смены операций временем в секундах на момент запроса
 
if ($t & 1) //меняем операцию в соответствии с четностью переменной
        {
           $_SESSION['res'] = $first + $second; //заносим результат в сессионную переменную
 $action = "плюс"; //выводимое в браузер действие
        }
else
        {
          $_SESSION['res'] = $first – $second;
 $action = "минус";
        }
  ?>
  • Обработчик check_it.php:
<?php
/***********************************************
/* Captcha: addition or subtraction in a text mode script - © «OIS» aka Coder (http://coder.hol.es)
/* This notice MUST stay intact for legal use
/* Visit http://coder.hol.es/ for this script and others.
***********************************************/
session_start();//продолжаем сессию

if (isset($_POST['result'])) { //если это был ответ

if (trim(strip_tags($_POST['result'])) == $_SESSION['res']) { //убираем, на всяки случай, теги и пробелы с обоих сторон и сравниваем результаты
$_SESSION['msg'] = " Верно!<img src=smiles/smile.gif  style=margin-left:5px;>";
}
else {
$_SESSION['msg'] =  " Ошибочка вышла...<img src=smiles/confused.gif style=margin-left:5px;>";
}
 
if (empty($_POST['result'])) {
$_SESSION['msg'] = " Нужно ввести ответ...<img src=smiles/wink.gif style=margin-left:5px;>";
}

 }
header("Location: index.php"); //возвращаемся на страницу формы "GET" методом
exit; 
?>
  • Запускной файл с формой ввода index.php:

Перед <!DOCTYPE>:

<?php
session_start(); //начинаем сессию
require_once "captcha_dig.php";//подключаем блок капчи
?>

Между <body></body>:

<div style="text-align:center">

<h1>Капча: решение текстового примера со сложением или вычитанием</h1>

<form method="POST" name="dig_form" id="dig_form" action="check_it.php" style="border:1px dotted grey;width:300px;margin:0 auto;padding:5px;" >

Сколько будет:
<!-- выводим текстовое описание примера //-->
<?="$first_l $action $second_l"?>? <input type="text" id="result" name="result" value="" style="width:17px; font-weight:bold;"><br />

<input type="submit" id="submit" value="Отправить" style="margin-top:10px; margin-bottom:10px;">

</form>
<!-- выводим соотв. сообщение //-->
<span style="background:yellow;"><?=$_SESSION['msg'] ?></span>

<!-- очищаем сесионную переменую сообщения //-->
<?php unset ($_SESSION['msg']);?>

</div>

 Смотреть пример

  Размер:  4,07kB | Изменен: 14.09.13 | Загрузок: 106

+↴

⇥ Модифицируем скрипт капчи: решение примера со сложением или вычитанием объектов

Капча: решение примера со сложением или вычитанием объектов

  • Файл капчи captcha_dig.php:

 <?php
/***********************************************
/* Captcha: addition or subtraction of objects script – © «OIS» aka Coder (http://coder.hol.es)
/* This notice MUST stay intact for legal use
/* Visit http://coder.hol.es/ for this script and others.
***********************************************/
$first = rand(1, 5); //получаем случайное значение
$second = rand(1, 5);

 if ($first == $second) {//убираем возможность одинаковости первого и второго числа и исключаем тем самым нулевой результат
 $first = rand(1, 3);
 $second = rand(4, 5);
 }

 function mirror ($name, $name_l) //привязываем к выводимой в браузер ($first_l и $second_l) переменной текстовое значение в соответствии с используемой при вычислении 
  {
   
$g = "";//картинка яблока
$r = "";
   
 switch ($name) { 
case 1:
    $name_l = "$g"; break;
case 2:
    $name_l = "$r$g"; break;
case 3:
    $name_l = "$r$g$r"; break;
case 4:
    $name_l = "$r$g$r$g"; break;
case 5:
    $name_l = "$r$g$r$g$r"; break;
}
return $name_l;
 }
 
 $first_l = mirror ($first, $first_l); //инициализируем переменную
 $second_l = mirror ($second, $second_l);
 
$p = "";//картинка "плюса"
$m = "";
 
$t = time();  //инициализируем переменную для смены операций временем в секундах на момент запроса
    
if ($t & 1) //меняем операцию в соответствии с четностью переменной
        {
           $_SESSION['res'] = $first + $second; //заносим результат в сессионную переменную
 $action = "$p"; //выводимое в браузер действие
        }
else
        {
          $_SESSION['res'] = $first – $second;
 $action = "$m";
        }
  ?>
  • Обработчик check_it.php:
<?php
/***********************************************
/* Captcha: addition or subtraction of objects script - © «OIS» aka Coder (http://coder.hol.es)
/* This notice MUST stay intact for legal use
/* Visit http://coder.hol.es/ for this script and others.
***********************************************/
session_start();//продолжаем сессию

if (isset($_POST['result'])) { //если это был ответ

if (trim(strip_tags($_POST['result'])) == $_SESSION['res']) { //убираем, на всяки случай, теги и пробелы с обоих сторон и сравниваем результаты
$_SESSION['msg'] = " Верно!<img src=smiles/smile.gif  style=margin-left:5px;><br />
<img src=images/yes.jpg width=200 height=139 />";
}
else {
$_SESSION['msg'] =  " Ошибочка вышла...<img src=smiles/confused.gif style=margin-left:5px;><br />
<img src=images/non.jpg width=200 height=125 />";
}
 
if (empty($_POST['result'])) {
$_SESSION['msg'] = " Нужно ввести ответ...<img src=smiles/wink.gif style=margin-left:5px;><br />
<img src=images/need.jpg width=200 height=133 />";
}

 }
header("Location: index.php"); //возвращаемся на страницу формы "GET" методом
exit; 
?>
  • Запускной файл с формой ввода index.php:


Перед <!DOCTYPE>:

<?php
session_start(); //начинаем сессию
require_once "captcha_dig.php";//подключаем блок капчи
?>

Между <body></body>:

<div style="text-align:center">
<h1>Капча: решение примера со сложением или вычитанием объектов</h1>

<form method="POST" name="dig_form" id="dig_form" action="check_it.php" style="border:1px dotted grey;width:300px;margin:0 auto;padding:5px;" >
<!-- выводим текстовое описание примера //-->
<?="$first_l $action $second_l"?> <br />
Ваш ответ: <input type="text" id="result" name="result" value="" style="width:17px; font-weight:bold;margin-top: 10px;" /><br />
<input type="submit" id="submit" value="Отправить" style="margin-top:10px; margin-bottom:10px;" />
</form>
<!-- выводим соотв. сообщение //-->
<span style="background:yellow;"><?=$_SESSION['msg']?></span>

<!-- очищаем сесионную переменую сообщения //-->
<?php unset ($_SESSION['msg']);?>

</div>

 Смотреть пример

  Размер:  20,87kB | Изменен: 14.09.13 | Загрузок: 38

+↴

⇥ Модифицируем скрипт капчи: подсчет количества объектов по цвету

Капча: подсчет количества объектов по цвету

  • Файл капчи captcha_dig.php:

<?php
/***********************************************
/* Captcha: count a quantity of colored objects script - © «OIS» aka Coder (http://coder.hol.es)
/* This notice MUST stay intact for legal use
/* Visit http://coder.hol.es/ for this script and others.
***********************************************/
$first = rand(1, 5); //получаем случайное значение
$second = rand(1, 5);

if ($first == $second) {//убираем возможность одинаковости первого и второго числа и исключаем тем самым нулевой результат
 $first = rand(1, 3);
 $second = rand(4, 5);
 }

 function mirror ($name, $name_l) //привязываем к выводимой в браузер ($first_l и $second_l) переменной текстовое значение в соответствии с используемой при вычислении 
  {
$g = "<img src=images/yabl_gr.png align=absmiddle />";//картинка яблока
$r = "<img src=images/yabl_r.png align=absmiddle />";
  switch ($name) { 
case 1:
    $name_l = "$g"; break;
    case 2:
    $name_l = "$r$g"; break;
case 3:
    $name_l = "$r$g$r"; break;
case 4:
    $name_l = "$r$g$r$g"; break;
case 5:
    $name_l = "$r$g$r$g$r"; break;
}
return $name_l;
 }
 
 $first_l = mirror ($first, $first_l); //инициализируем переменную
 $second_l = mirror ($second, $second_l);

// привязываем количество цвета к значению $first и $second 
 function mirrorColor ($numvar){
     switch ($numvar) {
        case 1:
        $green = 1;
        $red = 0; break;    
     case 2:
        $green = 1;
        $red = 1; break;
     case 3:
        $green = 1;
        $red = 2; break;
     case 4:
        $green = 2;
        $red = 2; break;
     case 5:
        $green = 2;
        $red = 3; break;
    }
 return array ($green, $red);
 }
 
$f_color = mirrorColor ($first);// инициализируем массив
$s_color = mirrorColor ($second); 

$gr_word = "<span style=color:green;font-weight:bolder>зеленых</span>";
$red_word = "<span style=color:red;font-weight:bolder>красных</span>";
 
$t = time();  //инициализируем переменную для смены операций временем в секундах на момент запроса
  
if ($t & 1) //меняем операцию в соответствии с четностью переменной
        {
           $_SESSION['res'] = $f_color['0'] + $s_color['0']; //заносим результат в сессионную переменную
 $color = "$gr_word";//выводимое в браузер название цвета
         }
else
        {
          $_SESSION['res'] = $f_color['1'] + $s_color['1'];
 $color = "$red_word";
        }
  ?>

  • Обработчик check_it.php: такой же, как и во втором случае.
  • Запускной файл с формой ввода index.php:


Перед <!DOCTYPE>:

<?php
session_start(); //начинаем сессию
require_once "captcha_dig.php";//подключаем блок капчи
?>

Между <body></body>:

<div style="text-align:center">

<h1>Капча: подсчет количества объектов по цвету</h1>

<form method="POST" name="dig_form" id="dig_form" action="check_it.php" style="border:1px dotted grey;width:300px;margin:0 auto;padding:5px;" >
<!-- выводим текстовое описание примера //-->
Сколько <?=$color?> яблок?<br />
<?="$first_l$second_l"?> <br />
Ваш ответ: <input type="text" id="result" name="result" value="" style="width:17px; font-weight:bold;margin-top: 10px;" /><br />
<input type="submit" id="submit" value="Отправить" style="margin-top:10px; margin-bottom:10px;" />
</form>

<!-- выводим соотв. сообщение //-->
<span style="background:yellow;"><?=$_SESSION['msg']?></span>

<!-- очищаем сесионную переменую сообщения //-->
<?php unset ($_SESSION['msg']);?>

</div>

 Смотреть пример

  Размер:  21,13kB | Изменен: 19.09.13 | Загрузок: 43

Бесплатные курсы

Категории

Теги: , , , , , , , , , , , , ,

Оцените материал:

Рейтинг: 10.0/10 (1)


КомментарииКомментарии:

Нет комментариев к этой статье.


Поля, обозначенные как *, обязательны.





Максимальная длина сообщения 900 символов. Осталось   символов

 

Старые →← Новые