#php #numbers #captcha
#php #числа #капча
Вопрос:
Доступна ли числовая капча для PHP?
(которая не зависит от включенного JavaScript)
Редактировать:
- Я знаю, что существуют капчи, не зависящие от JS.
- Я знаю, что существуют PHP-капчи.
- Я знаю, что существуют числовые капчи.
Но я ищу независимую от PHP числовую капчу для Javascript.
Единственные числовые капчи, которые я нашел, предназначены либо для ASP.NET или на основе jQuery / JS.
Я не хочу ничего из этого в качестве ответа на вопрос.
И я не говорю здесь о маленьком веб-сайте. В ответе я хотел бы знать, создает ли ваше предложение большую нагрузку на сервер или нет.
Комментарии:
1. В Интернете существует множество систем капчи. И не так уж сложно закодировать ее самостоятельно. Вы знакомы с php?
2. большинству captcha не нужен javascript, погуглите его google.com /…
3. Javascript часто используется только для запутывания в этом контексте. Если числа отображаются на странице как есть, специально созданный спам-бот может слишком легко их прочитать. (Практически ни один из автоматизированных не выполняет.)
4. @faileN да, я очень хорошо знаком с PHP. Чтобы избавить себя от лишних хлопот, я бы хотел просто использовать готовую. Если нет, я мог бы попробовать взять код из Tips Tricks numeric ASP captcha и перевести его. Но все же я слышал, что создание изображений во время выполнения очень дорого
5. Вы можете попробовать это: captchas.net/sample/php .
Ответ №1:
Я полагаю, что нельзя избежать рендеринга изображения при работе с капчами? Вот простая (и, возможно, не самая элегантная):
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
Комментарии:
1. Спасибо за первый правильный ответ. Если бы я использовал это, я думаю, я мог бы установить значения shadow случайным образом. Но является ли эта генерация изображения дорогостоящей? Я не говорю здесь о маленьком веб-сайте.
2. @Adam, даже крупные веб-сайты используют графические капчи, и они не слишком беспокоятся о том, что это дорого, потому что они знают, что их система справится с этим.
3. @lbu Вот почему я использовал Stack Overflow. Я ищу ответ на конкретную нетривиальную проблему.
4. @tradyblix Тогда, я думаю, вопрос в том, сможет ли наша система справиться с этой дополнительной нагрузкой, и если сможет, будет ли мой босс согласен с дополнительной нагрузкой. Хм
5. @Adam, на это я не могу ответить, тебе нужно разобраться со своим
boss
. Я предоставил ответ наIs there a numeric captcha available for PHP?
и я полагаю, что вы не упомянули о каких-либо проблемах с загрузкой сервера, которые могут вызвать вас и вашboss
.
Ответ №2:
CAPTCHA не обязательно полагаются на javascript (я думаю, вы думаете о reCATCHA), все, что вам нужно, — это отдельное изображение.
В самом простом случае числовая КАПЧА будет работать следующим образом…
<?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. Нет. Я не думаю о reCAPTCHA.
2. @fire может ли это обеспечить числовую капчу?
3. reCATCHA также может использоваться без javascript
4. Этот способ легко обойти. Если бы я хотел украсть ваш контент или заспамить ваш сайт, вы облегчаете мне задачу. Вы не можете жестко закодировать капчу подобным образом
5. preg_match(‘#число: (.*)</p>#’); :p
Ответ №3:
Возможно, вы также думали о фиглетной капче. Это экономит много времени, потому что вам не нужно отображать изображения. На своей домашней странице я использую этот вид капчи. Вы можете взглянуть на эту страницу (прокрутите до низа, вы не можете ее просмотреть ;)). Я реализовал ее с помощью Zend-Framework. Лучше сказать с помощью Zend_Captcha_Figlet.
Однако я думаю, что это сложно реализовать, если вы не используете Zend_Form. Но я думаю, что это довольно хорошее решение.
Редактировать
Другим решением была бы слепая капча. Она очень проста в реализации и отлично работает (у меня был хороший опыт работы с этим в течение длительного времени). Это работает следующим образом:
- В вашей форме укажите поле ввода с пустым значением.
- Изначально скройте ее с помощью css (это не следует делать с помощью встроенных стилей)
- в вашей форме проверки (php) проверьте, содержит ли это поле значение. если это так, то, вероятно, это спам-бот, который заполнил каждое поле ввода.
- Пользователь не будет заполнять ее, потому что он ее не видит (конечно, он ее увидит, если он отключил css в своем браузере)
Простая, но эффективная.
Комментарии:
1. Мне нравится эта идея, но я где-то читал (кажется, сейчас не могу найти сообщение), что это легко обойти. Это правда?
2. Я могу говорить только за себя. Я не получал спама с этой активной капчей. Я уверен, что ее можно обойти, но я не могу представить, что это легко. Или, скажем, большинство разработчиков спам-ботов концентрируются на попытках обойти изображения, а не на figlet. Так что вероятность того, что спам-бот вообще поймет, что вы делаете, меньше..
3. Я также предоставил другую возможность использования капчи. Смотрите мой ответ выше
4. Проблема в том, что на нашем сайте мы не защищаем от спама (он не управляется сообществом). Таким образом, мы не сможем протестировать ее так, как смогли вы («Я не получал спам»). При нашем типе бизнеса люди активно стремятся очистить наш контент, поэтому, если они поймут, что мы ввели ограничение на запрос и капчу, они посмотрят на это и попробуют обойти это. Итак, мне нужно выяснить, достаточно ли безопасны figlet, я полагаю. Надеюсь, эта информация есть в Сети, и мне не придется ее тестировать
Ответ №4:
Вы можете использовать http://www.captcha.ru/kcaptcha / По умолчанию эта библиотека генерирует ключ с символами алфавита, но вы можете изменить конфигурационный файл (установить новое значение для переменной $allowed_symbols = «0123456789» в качестве примера) для генерации только цифровых ключей.
Ответ №5:
Не используйте никакие другие файлы 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>
Комментарии:
1. Я не могу понять, это троллинг или решение, которое кто-то использует?
2. Да, я использовал для своей формы
3. Тогда я сожалею о вашей компании, это совершенно небезопасно
4. использование переменной на стороне клиента небезопасно и представляет опасность
Ответ №6:
Просто откройте любой php-файл с капчей и удалите буквы из строки, которая генерирует слово captcha