Простой скрипт капчи, которая представит достаточную сложность для автораспознавателей капч и которая может быть заточена в широком диапазоне. Сложение и вычитание выбраны для "ненапряжности" для посетителей и меняются случайным образом; можно применять другие математические действия, в любом сочетании. Использование текстового описания примера также может быть заменено на желаемый вариант – например, на картинки цифр, объектов и т.д. Вообще скрипт очень прост и гибок.
Посетителю предлагается решить пример на сложение или вычитание, причем действие меняется случайным образом и условие примера описывается словами. Результат примера может быть отрицательным, что подразумевает введение знака "минус", а возможность получения нулевого результата исключена, как исключена и возможность повторной отправки одного и того же ответа через обновление страницы.
Подробные объяснения содержатся в теле скрипта; все замечания, предложения, улучшения и комментарии будут восприняты с благодарностью :)
Пример использования:
- Файл капчи
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>
Комментарии:
Нет комментариев к этой статье.