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

- Файл капчи
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>
+↴
⇥ Модифицируем скрипт капчи: решение примера со сложением или вычитанием объектов

- Файл капчи
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>
+↴
⇥ Модифицируем скрипт капчи: подсчет количества объектов по цвету

- Файл капчи
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>






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