1

我正在尝试将验证码与使用表单集成。我所拥有的是一种基本格式,可以让验证码部分在其自己的 php 页面上工作。我还能够在自己的 php 页面中显示一个表单。我遇到的问题是我不确定如何让这两个部分一起工作。

这是我所拥有的一个片段:

<?php
session_start();
    if (isset($_POST['captcha'])) {
        $_SESSION['captcha'] = rand(0, 99999999999);
        } else {
            if ($_SESSION['captcha']!==$_POST['captcha']) {
            echo 're-enter a new captcha!';
            $_SESSION['captcha'] = rand(0, 99999999999);
        }
    }
?>

    <form action="formx.php" method="POST">
            <ul>
                <li>
                    Username:<br>
                    <input type"text" name="username">
                </li>
                <li>
                    Password:<br>
                    <input type="password" name="password">
                </li>
                <li>
                    Password again:<br>
                    <input type="password" name="password2">
                </li>
                <li>
                    Email:<br>
                    <input type="text" name="email">
                </li>
                <li>
                    <input type="submit" name="captcha" value="submit">
                </li>
            </ul>
    </form> 
4

3 回答 3

0

如果你走过它,你可能会错过几个步骤:

if ($_SERVER['REQUEST_METHOD']!='POST')  //If initial load, load up captcha into session
    $_SESSION['captcha'] = rand(0,9999999999);
else{//Means form was submitted
    if (isset($_POST['captcha'])) {//Check if they entered
        if ($_SESSION['captcha']!==$_POST['captcha']) {//check if ! correct, reissue new captcha
            echo 're-enter a new captcha!';
            $_SESSION['captcha'] = rand(0, 99999999999);
        }else{
            //Everything was good, handle data
        }
    }else{//Nothing was entered, give them new captcha
        echo 'please enter the captcha!';
        $_SESSION['captcha'] = rand(0, 99999999999);
    }

}

现在,当您将其显示给用户时,棘手的部分就来了。如果你放:

<li>
    Please type <?=$_SESSION['captcha']?>:<br/>
    <input type="submit" name="captcha" value="submit">
</li>

机器人将能够绕过这一点。所以你需要弄清楚如何克服这个问题。简单地显示数字并告诉他们输入是好的,并且会阻止非常基本的机器人。混淆它 ( <span>1</span><span>2</span>) 可能会使它变得更加困难,但机器人仍然可以解析它并绕过它。将其保存为 Javascript 变量,然后对其进行检查也可能有效,但如果机器人足够聪明,可以再次绕过它。iframe 可能会工作,图像可能会工作,用户代理解析可能会有所帮助,等等等等。所有这些都可以工作,但是您希望如何实现它以及您想要它的安全性取决于您。

就个人而言,虽然我是 Recaptcha 的粉丝,因为它通常很容易实现,并且我需要最少的编码。我还使用 GD 和 TrueType 库来制作验证码图像,但这确实需要更多的编程,如果你可以使用 Recaptcha 则可能不值得。最后,我确实喜欢在页面加载后加载的 Javascript 数学问题,机器人更难加载和弄清楚发生了什么。

说到底,做你想做的事。如果您遇到困难,请发布您的代码,我们可以帮助您。

于 2012-12-19T04:55:31.887 回答
0

您必须检查以前的验证码以提交新页面。所以请将会话旧变量中的旧值分配为 $_SESSION['oldCaptcha'].. 所以您的代码应该是,

session_start();
if (isset($_POST['captcha'])) {
    if($_SESSION['oldCaptcha'] == $_POST['captcha']) {
        echo 'Captcha is Successfully Matched';
    }
    else {
        $_SESSION['oldCaptcha'] = rand(0, 99999999999);   
    }         
}

如果您的答案出现在 else 循环中,则在表单中使用$_SESSION['oldCaptcha']以显示供用户输入...

于 2012-12-19T05:00:01.600 回答
0

试试这个

if($_SERVER['REQUEST_METHOD']=="POST"){
    if ($_POST['capt']  == $_SESSION['captcha'] ){
        echo "Sucsess";
        $capt= rand(0, 99999999999);  
        $_SESSION['captcha'] =$capt;
    }else{
        echo "Fail";
    }
}else{
     $capt='';  
     $capt= rand(0, 99999999999);  
     $_SESSION['captcha'] =$capt;
}    

?>

    <form action="" method="post">
            <ul>
                <li>
                    Username:<br>
                    <input type="text" name="username">
                </li>
                <li>
                    Password:<br>
                    <input type="password" name="password">
                </li>
                <li>
                    Password again:<br>
                    <input type="password" name="password2">
                </li>
                <li>
                    Email:<br>
                    <input type="text" name="email">
                </li>
                <li>
                    Captcha:<br>
                    <input type="text" name="capt" >
                    <?php echo "Captcha : " .$capt ; ?> 
                </li>
                <li>
                    <input type="submit" name="captcha" value="submit">
                </li>
            </ul>
    </form> 
于 2012-12-19T05:13:06.583 回答