自定义PHP CAPTCHA

时间:2012-09-08 18:30:34

标签: php captcha

我编写了一个显示随机方程式的php函数。如果未提供正确答案,则提交失败。这个等式是这样的:

[随机数字或文本编号] [随机选择+, - ,x] [随机数字或文本编号] =?

所以你可能会看到: 8 + 2 = ?,或7 - 4 =?等等

我已经手动测试了它,它似乎工作得很漂亮。我无法正确回答CAPTCHA。尽管有这个CAPTCHA,但有些人或某人正在发送垃圾邮件。 所以我的问题是,是否有可以解决此问题的程序?

这是我的表格:

<form action="scripts/handler_post.php" method="post" id="gb_form">
                    <h3>Leave us a comment:</h3><br />
                    <div id="form_msg"><?php echo $msg; ?></div>
                    <input type="text" name="name" value="Your Name" />
                    <textarea name="message">Your Message</textarea>

                    <?php include('includes/bmw_captcha.php'); ?> 
                    <div style="color:red; font-size:90%;">*What does <?php echo $array_num1[1] . " " . $array_calculation[0] . " " . $array_num2[1] . " = "; ?>    
                    <input type='text' maxlength='2' name='captcha' style="color:#640513; width:25px;" />?</div>
                    <div><span style="font:italic 90% Arial; color:#666;">(For security purposes, please answer this CAPTCHA problem.)</span></div>
                    <input type="hidden" name="captcha_answer" value="<?php echo $array_calculation[1]; ?>" />

                    <input type="submit" name="submit_button" value="Post" />
                </form>

这是处理表单的脚本:

// submitted values
$name       = clean_string( $_POST['name'] );
$message    = clean_string( $_POST['message'] );
$captcha    = clean_string( $_POST['captcha'] );
$captcha_ans= clean_string( $_POST['captcha_answer'] );

// check if name var is empty or contains digits
if( empty($name) || (strcspn( $name, '0123456789' ) != strlen( $name )) ) 
{ header( 'Location: /guestbook.php?msg=n' ); }

else if( empty($message) )
{ header( 'Location: /guestbook.php?msg=m' ); }

else if( empty($captcha) || $captcha != $captcha_ans )
{ header( 'Location: /guestbook.php?msg=cap' ); }

else 
{
    $query = "
            INSERT INTO $table_posts ( id, name, message, timestamp ) 
            VALUES( 0, \"$name\", \"$message\", now() )
    ";

    $result = $db_connect->query( $query ); // execute the query

    if( $result )
    {       
        header('Location: ../guestbook.php?msg=1');
    }

    else
        header('Location: ../guestbook.php?msg=2');
}

3 个答案:

答案 0 :(得分:2)

您应该将会话变量的答案存储在会话变量中。通过表单以明文形式发送它使得机器人可以将字段设置为它想要的任何值。机器人通常会将所有未知字段设置为某些字符串,例如 ijhsg87dfb34 ,因此如果它将captchacaptcha_answer字段设置为相同的值,它将成功!

答案 1 :(得分:1)

一个非常简单的方法是使用隐藏字段,并在处理POST的脚本中检查是否填写了该字段,如果是,那么它是BOT等,因为普通用户永远不会看到该字段但是BOT等只是盲目地填补每一个领域。

答案 2 :(得分:0)

您可以尝试使用非验证码安全表单。检查一下 http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHAs