Числовая капча для PHP

Доступна ли числовая капча для PHP?

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


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

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

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

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


person Adam Lynch    schedule 18.05.2011    source источник
comment
В сети существует множество капч-систем. И не так уж сложно закодировать его самостоятельно. Вы знакомы с пхп?   -  person Fidi    schedule 18.05.2011
comment
большинству капч не нужен javascript, погуглите google.com/   -  person Ibu    schedule 18.05.2011
comment
Javascript часто используется только для запутывания в этом контексте. Если числа отображаются на странице как есть, специально созданный спам-бот может слишком легко их прочитать. (Практически ни один из автоматизированных не делает.)   -  person mario    schedule 18.05.2011
comment
@faileN да, я очень хорошо знаком с PHP. Чтобы избавить себя от хлопот, я хотел бы просто использовать готовый. Если нет, я мог бы попробовать взять код из Tips Tricks numeric ASP captcha и перевести его. Но все же я слышал, что создание образов во время выполнения очень дорого.   -  person Adam Lynch    schedule 18.05.2011
comment
Вы можете попробовать это: captchas.net/sample/php .   -  person Abrar Jahin    schedule 21.11.2014
comment
Вы можете попробовать это: captchas.net/sample/php .   -  person Abrar Jahin    schedule 21.11.2014


Ответы (6)


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

пример вывода

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
person tradyblix    schedule 18.05.2011
comment
Спасибо за первый правильный ответ. Если бы я использовал это, я думаю, я мог бы установить значения тени случайным образом. Но дорого ли обходится это создание изображений? Я не говорю о маленьком сайте здесь. - person Adam Lynch; 18.05.2011
comment
@ Адам, даже крупные веб-сайты используют капчи изображений, и они не слишком беспокоятся о том, что это дорого, потому что они знают, что их система может с этим справиться. - person tradyblix; 18.05.2011
comment
@lbu Вот почему я использовал переполнение стека. Ищу ответ на конкретную нетривиальную проблему. - person Adam Lynch; 18.05.2011
comment
@tradyblix Тогда, я думаю, вопрос в том, сможет ли наша система справиться с этой дополнительной нагрузкой, и если сможет, будет ли мой босс в порядке с дополнительной нагрузкой. Хм - person Adam Lynch; 18.05.2011
comment
@ Адам, на что я не могу ответить, тебе нужно разобраться со своим boss. Я предоставил ответ на Is there a numeric captcha available for PHP?, и я полагаю, что вы не упомянули о каких-либо проблемах с нагрузкой на сервер, которые могут вызвать у вас и вашего boss. - person tradyblix; 18.05.2011
comment
пример не требует интенсивной нагрузки, но его легко взломать, любая капча, которую вы реализуете, добавит больше кода, что означает большую нагрузку, если вы не передадите ее на аутсорсинг, но тогда вам все равно придется повторять ее. я поиграл с примером и добавил много случайных вещей, используя imagearc() в цикле :) - person Lawrence Cherone; 18.05.2011
comment
@Лоуренс Спасибо! Легко взломать? Хотите уточнить? - person Adam Lynch; 18.05.2011

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

http://www.phpcaptcha.org/

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

<?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>
person fire    schedule 18.05.2011
comment
Нет. Я не думаю о reCAPTCHA. - person Adam Lynch; 18.05.2011
comment
@fire может ли это предоставить числовую капчу? - person Adam Lynch; 18.05.2011
comment
reCATCHA можно использовать и без javascript - person Yuda Prawira; 18.05.2011
comment
Это способ легко обойти. Если я хочу украсть ваш контент или спамить ваш сайт, вы облегчите мне задачу. Вы не можете жестко кодировать капчу так - person Adam Lynch; 18.05.2011
comment
preg_match('#number: (.*)‹\/p›#'); :п - person Lawrence Cherone; 18.05.2011

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

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

ИЗМЕНИТЬ

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

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

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

person Fidi    schedule 18.05.2011
comment
Мне нравится эта идея, но я где-то читал (сейчас не могу найти пост), что это легко обойти. Это правда? - person Adam Lynch; 18.05.2011
comment
Я могу говорить только за себя. Я не спамил с этой активной капчей. Я уверен, что это можно обойти, но я не могу себе представить, что это легко. Или, скажем, большинство разработчиков спам-ботов концентрируются на попытке обойти изображения, а не на фиглет. Так меньше шансов, что спам-бот вообще поймет, что вы делаете. - person Fidi; 18.05.2011
comment
Я также предоставил еще одну возможность капчи. Смотрите мой ответ выше - person Fidi; 18.05.2011
comment
Проблема в том, что на нашем сайте мы не защищаем от спама (он не поддерживается сообществом). Так что мы не сможем протестировать его, как вы (я не спамил). С нашим типом бизнеса люди будут активно собирать наш контент, поэтому, если они поймут, что мы установили лимит запросов и капчу, они посмотрят на это и попытаются обойти его/обойти. Итак, мне нужно выяснить, достаточно ли защищены фиглеты. Надеюсь, эта информация есть в сети, и мне не нужно ее проверять. - person Adam Lynch; 18.05.2011

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

person Alexander    schedule 28.05.2015

Не используйте другие 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>
person Community    schedule 26.06.2013
comment
Не могу понять, это троллинг или какое-то решение? - person Sergey Telshevsky; 21.08.2013
comment
Да, я использовал для своей формы - person ; 22.08.2013
comment
Тогда мне жаль вашу компанию, это совершенно небезопасно - person Sergey Telshevsky; 22.08.2013
comment
использование переменной на стороне клиента небезопасно и опасно - person Hamid; 22.10.2016

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

person user610961    schedule 07.03.2014