Как сравнить поле ввода с переменной при отправке в php? - PullRequest
0 голосов
/ 21 апреля 2020

Я создал случайную строку и использовал ее как капчу, но не смог подтвердить. Я очень нуб в PHP. здесь я использовал isset($_POST['submit']), но без нажатия на кнопку отправить эта форма показывает ошибку (переменную) (требуется strCaptcha). Моя логика c заключается в том, что при отправке кода клика будет сравниваться значение 'strCaptcha' с $str и показываться ошибка или запускаться форма.

$error = '';
if (isset($_POST['submit'])){
  if (empty($_POST["strCaptcha"]) || $_POST["strCaptcha"] != $str) {
    $error = "strCaptcha is required";
   }
}
<form method="post" action="<?php echo $action; ?>" >
    <p><label><b>COA Number:</b></label><br>
    <input type="text" name="number" class="text"><br><be>
    <span id="realcap" style="visibility:hidden;"><?php echo implode(' ',str_split($str)); ?></span><be>
    <span style="color:red;"><?php echo $error; ?></span><br>
    <img src="" id="captch" alt="This Is a CAPTCHA Image"><br>
    <label><b>Enter the text of the image above:</b></label><br>
    <input name="strCaptcha" type="text" class="text" value="" maxlength="5"><br><br>
    <input type="submit" class="awesome medium" name="submit" value="Verify Now"></p>
</form>

Добавленное изображение

<script src="//cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
<script>
  html2canvas(document.getElementById("realcap"), {
    onrendered: function(canvas) {
      var screenshot = canvas.toDataURL("image/png");
      document.getElementById("captch").setAttribute("src", screenshot);
    }
  });
</script>

случайная строка

$n=5; 
function getName($n) { 
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    $randomString = ''; 
    for ($i = 0; $i < $n; $i++) { 
        $index = rand(0, strlen($characters) - 1); 
        $randomString .= $characters[$index]; 
    } 
    return $randomString; 
} 

$str = getName($n);

1 Ответ

1 голос
/ 21 апреля 2020

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

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

Код страницы

<?php 
session_start();
$captcha = $_SESSION['captcha'];
$error = '';
if (isset($_POST['submit'])){
  if (empty($_POST["strCaptcha"]) || $_POST["strCaptcha"] != $captcha) {
    $error = "strCaptcha is required";
   }
}
<form method="post" action="<?php echo $action; ?>" >
    <p><label><b>COA Number:</b></label><br>
    <input type="text" name="number" class="text"><br>
    <span style="color:red;"><?php echo $error; ?></span><br>
    <img src="image.php" id="captch" alt="This Is a CAPTCHA Image"><br>
    <label><b>Enter the text of the image above:</b></label><br>
    <input name="strCaptcha" type="text" class="text" value="" maxlength="5"><br><br>
    <input type="submit" class="awesome medium" name="submit" value="Verify Now"></p>
</form>

Изображение должно быть создано на стороне сервера.

Пример не проверен. изображение. php

<?php 
$n=5; 
function getName($n) { 
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    $randomString = ''; 
    for ($i = 0; $i < $n; $i++) { 
        $index = rand(0, strlen($characters) - 1); 
        $randomString .= $characters[$index]; 
    } 
    return $randomString; 
} 


$str = getName($n);
session_start();
$_SESSION['captcha'] = $str;

// Generate image using the $str to create the image.
$im = imagecreate(100, 30);

// White background and blue text
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);

// Write the string at the top left
imagestring($im, 5, 0, 0, $str, $textcolor);

// Output the image
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);


...