2016-06-12 12 views
0

私は数学でcaptchaを作ろうとしています。私は2つのランダム変数をとり、合計してユーザー入力とマッチさせます。しかし、私/ユーザーが送信ボタンをクリックすると、2つの変数の値が変化し、ユーザーの入力と一致しません。どうすればこの問題を解決できますか?なにか提案を ?数学を使ったCaptcha

<?php  
    $a = rand(1,9); 
    $b = rand(1,9); 
    $z = $a + $b; 
    if(isset($_POST["submit"])){ 

    $captcha = $_POST['captcha']; 
     if ($captcha != $z){ 
     echo $captcha." and ".$z; 
     } 
     else { 
     echo "true";  
     } 

    } 
    ?> 

<form class="form-horizontal" method="POST" action=""> 
    <div class="input-group"> 
    <span><?php echo $a."+".$b."= ?"; ?></span> 
    <input type="text" name="captcha"> 
    </div> 
    <button name="submit">submit</button> 
</form> 
+0

の使用方法についての詳細を読んだり、別のファイルにあなたのロジックを分離することができ –

+0

使用[セッション](http://php.net/ manual/en/features.sessions.php)を使用して、同じユーザーによる後続のリクエストで使用するために生成した乱数を格納します。 –

+0

これは簡単にボットに敗北した貧弱なCAPTCHAです –

答えて

2

セッション変数で受け取ると予想される正しい結果を保持することはどうですか? これはエンドユーザーにとっては目に見えず、$_POSTの値で簡単にチェックすることができます。

は、ここで私が考えているものです:

<?php 
session_start(); 

if (!isset($_POST['submit'])) { 
    $a = rand(1,9); 
    $b = rand(1,9); 
    $z = $a + $b; 

    $_SESSION['captcha_result'] = $z; 
} else { 
    $z = $_SESSION['captcha_result']; 
    unset($_SESSION['captcha_result']); 

    $captcha = $_POST['captcha']; 

    if ($captcha != $z) { 
     echo $captcha . " and " . $z; 
    } else { 
     echo "true"; 
    } 
    exit; // Don't display the form in case the user is summiting a captcha challenge 
} 
?> 

<form class="form-horizontal" method="POST" action=""> 
    <div class="input-group"> 
    <span><?php echo $a."+".$b."= ?"; ?></span> 
    <input type="text" name="captcha"> 
    </div> 
    <button name="submit">submit</button> 
</form> 

あなたがセッションにhere

+0

ところで、これは最初の場所で作成されたセッションです。後続のアクセスで特定のデータを保持する方法です。あなたのケースでは、2つのその後のアクセスがあります。あなたは基本的にcaptchaフォームを生成するときに1つのリクエストを行い、結果を提出するときに1つのリクエストを行い、投稿した最初のコードでは永続性はありません。 –

+0

それは今、感謝しています。 – Nazmul

関連する問題