За последние 24 часа нас посетили 22784 программиста и 1273 робота. Сейчас ищут 749 программистов ...

Как сделать примитивную капчу?

Тема в разделе "PHP для новичков", создана пользователем valtozavr, 3 ноя 2020.

Метки:
  1. valtozavr

    valtozavr Новичок

    С нами с:
    3 ноя 2020
    Сообщения:
    3
    Симпатии:
    0
    Пользователю выводится уравнение которое ему нужно решить, уравнение берется случайным образом. Но как я понял при нажатии на эту кнопку рандом заново генерируется и введённый ответ почти всегда не верный. Как это исправить?

    PHP:
    1. echo "
    2. <form action='{$_SERVER['SCRIPT_NAME']}'>
    3. <input type = 'text' name='n1'><br>
    4. <input type='submit' name='b1' value='нажми'>
    5. </form>
    6. ";
    7.  
    8. $r = array(
    9.     "3+5",
    10.     "7+4",
    11.     "8+14",
    12.     "7-6",
    13.     "9*2",
    14. );
    15. $g = mt_rand(0, 4);
    16. echo $r[$g];
    17. $r1 = array(
    18.     3 + 5,
    19.     7 + 4,
    20.     8 + 14,
    21.     7 - 6,
    22.     9 * 2,
    23. );
    24.  
    25. $t = $r1[$g];
    26. echo "<br>$t<br>";
    27.  
    28.  
    29.  
    30. if (isset($_REQUEST['b1']) ?? false)  {
    31.  
    32.     if ($_REQUEST['n1'] == $t) {
    33.         header('Location: http://123');
    34.     } else {
    35.         echo "<br>Ошибка";
    36.     }
    37. }
     
  2. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Код вроде верный, просто Location поменяйте на тот куда вам нужен редирект
     
  3. valtozavr

    valtozavr Новичок

    С нами с:
    3 ноя 2020
    Сообщения:
    3
    Симпатии:
    0
    да Location не важно я не могу ввести правильный ответ на уравнение. Например 7-6 вводишь 1 а он не идет в этот if, а идет в нижний где echo "ошибка". Может пойти по ссылке если повторить пару тройку раз. Как я понял он при нажатии на кнопку генерирует другое число и уже с ним работает.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    736
    Адрес:
    Татарстан
    Ну тут два варианта
    1. При показе капчи ответ на нее записывается им в сессию, при проверке проверяется ответ пользователя и ответ в сессии
    2. Раз такого характера капча, можете передать значение первого числа, второго и операцию скрытыми полями, а при проверке вычислить значение и сравнить с ответом пользователя
     
  5. amberson

    amberson Активный пользователь

    С нами с:
    23 июл 2020
    Сообщения:
    62
    Симпатии:
    14
    Решение уравнения запоминать нужно где-то чтоб сравнивать с ним потом ответ пользователя. Можно его прокинуть к пользователю же в зашифрованном виде, чтоб он его не подсмотрел.
    PHP:
    1. <?php
    2.  
    3. $salt = 'salt';
    4. $range = [5, 20];
    5.  
    6. $actions = [
    7.   '+' => function ($a, $b) { return $a + $b; },
    8.   '-' => function ($a, $b) { return $a - $b; },
    9.   '*' => function ($a, $b) { return $a * $b; },
    10. ];
    11.  
    12. $a = mt_rand($range[0], $range[1]);
    13. $b = mt_rand($range[0], $range[1]);
    14. $sign = array_rand($actions);
    15. $action = "$a $sign $b = ";
    16. $hash = md5($actions[$sign]($a, $b).$salt);
    17.  
    18. if(isset($_REQUEST['response']) && isset($_REQUEST['hash'])) {
    19.     $result = $_REQUEST['hash'] == md5(trim($_REQUEST['response']).$salt);
    20. }
    21. ?>
    22.  
    23. <form>
    24.   <span><?php echo $action; ?></span>
    25.     <input style="width:50px;" type="text" name="response">
    26.     <input type="hidden" name="hash" value="<?php echo $hash; ?>">
    27.     <input type="submit" value="Проверить">
    28. </form>
    29.  
    30. <?php if(isset($result)) { ?>
    31. <p>Ответ <?php echo $result ? '' : 'не'; ?> верен!</p>
    32. <?php } ?>
     
    valtozavr нравится это.
  6. valtozavr

    valtozavr Новичок

    С нами с:
    3 ноя 2020
    Сообщения:
    3
    Симпатии:
    0
    спс я просто нуб) только седня читал про эти hidden не понял на кой они нужны