Числовая капча для PHP - PullRequest
5 голосов
/ 18 мая 2011

Существует ли числовая капча для PHP ?

(, которая не зависит от включения JavaScript )


РЕДАКТИРОВАТЬ:

  • Я знаю, что есть независимые от JS капчи.
  • Я знаю, что есть PHP-капчи.
  • Я знаю, что там есть числовые капчи.

Но я ищу PHP-независимую от Javascript капчу.
Единственная числовая капча, которую я нашел, либо для ASP.NET, либо для jQuery / JSоснованные на них.
Я не хочу ни одного из них в качестве ответа на вопрос.

И я не собираюсь рассказывать о небольшом веб-сайте здесь.В ответ я хотел бы знать, сильно ли напрягает ваше предложение сервер или нет.

Ответы [ 6 ]

16 голосов
/ 18 мая 2011

Полагаю, нельзя избежать рендеринга изображения при работе с капчами? Вот простой (и, возможно, не самый элегантный):

sample output

session_start();

$strings = '123456789';
$i = 0;
$characters = 6;
$code = '';
while ($i < $characters)
{ 
    $code .= substr($strings, mt_rand(0, strlen($strings)-1), 1);
    $i++;
} 

$_SESSION['captcha'] = $code;

//generate image
$im = imagecreatetruecolor(124, 40);
$foreground = imagecolorallocate($im, 0, 0, 0);
$shadow = imagecolorallocate($im, 173, 172, 168);
$background = imagecolorallocate($im, 255, 255, 255);

imagefilledrectangle($im, 0, 0, 200, 200, $background);

// use your own font!
$font = 'monofont.ttf';

//draw text:
imagettftext($im, 35, 0, 9, 28, $shadow, $font, $code);
imagettftext($im, 35, 0, 2, 32, $foreground, $font, $code);     

// prevent client side  caching
header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

//send image to browser
header ("Content-type: image/png");
imagepng($im);
imagedestroy($im);

Показать в виде:

<img src="captcha.php">
Enter the code above: <input type="text" name="captcha">

После отправки проверьте введенный код:

if ($_POST['captcha'] == $_SESSION['captcha'])
    // do your thing
3 голосов
/ 18 мая 2011

CAPTCHA не обязательно полагается на javascript (я думаю, что вы думаете о reCATCHA), автономное изображение - это все, что вам нужно.

http://www.phpcaptcha.org/

На самом простом, числовая капча будет работать как ...

<?php
session_start();

if (isset($_POST['code'])) {
    if ($_POST['code'] == $_SESSION['captcha']) {
        echo "Captcha valid";
    }
    else {
        echo "Captcha NOT valid";
    }
}

$_SESSION['captcha'] = mt_rand(10000, 99999);
?>
<form action="" method="post">
    <p>Enter this number: <?php echo $_SESSION['captcha']; ?></p>
    <p><input type="text" name="code" /> <input type="submit" value="Submit" />
</form>
1 голос
/ 28 мая 2015

Вы можете использовать http://www.captcha.ru/kcaptcha/ По умолчанию эта библиотека генерирует ключ с символами алфавита, но вы можете изменить файл конфигурации (например, установить новое значение для переменной $ allow_symbols = "0123456789") для генерации только числовых ключей.

1 голос
/ 18 мая 2011

Может быть, вы также подумали о figlet капче. Это экономит много времени, потому что вам не нужны изображения для рендеринга. На моей домашней странице я использую этот вид капчи. Вы можете взглянуть на эту страницу (прокрутите страницу до конца, вы не сможете наблюдать за ней;)). Я реализовал это через Zend-Framework. Лучше сказать с Zend_Captcha_Figlet .

Однако я думаю, что это трудно реализовать, если вы не используете Zend_Form. Но я думаю, что это довольно хорошее решение.

EDIT

Другим решением будет слепая капча. Это очень легко реализовать и прекрасно работает (у меня был хороший опыт работы с этим в течение длительного времени). Это работает так:

  • В вашей форме укажите поле ввода с пустым значением.
  • Первоначально скрыть это с помощью css (это не следует делать с inline-стилями)
  • в вашей проверке формы (php) проверьте, содержит ли это поле значение. если это так, вероятно, это спамбот, который заполнил каждое поле ввода.
  • Пользователь не заполнит его, потому что он его не видит (конечно, он увидит его, если он отключил css в своем браузере)

Легко, но эффективно.

0 голосов
/ 07 марта 2014

Просто откройте любой файл php капчи и удалите буквы из строки, которая создает слово капчи

0 голосов
/ 26 июня 2013

Не используйте другие php-файлы для добавления числовой капчи в форму. Просто попробуйте следующее

    <input id="num1" type="text" name="num1" value="<?php echo rand(1,4); ?>" readonly="readonly" /> +
<input id="num2" type="text" name="num2" value="<?php echo rand(5,9); ?>" readonly="readonly" /> =
<input id="captcha" class="captcha" type="text" onblur="check_captcha(this.value);" maxlength="2" />  

, и в функции вы можете легко проверить

<script>
function check_captcha(res)
{
if(res)
{
var val=parseInt($('#num1').val())+parseInt($('#num2').val());
if(val!=res)
{
alert('Incorrect value, please try again');
$('#captcha').val('');
$('#captcha').focus();
}
}
}
</script>
...