【问题标题】:Logical Captcha from SQL Table and external checkSQL 表中的逻辑验证码和外部检查
【发布时间】:2013-04-16 20:52:24
【问题描述】:


这是我在这里的第一篇文章,所以如果我以错误的方式做某事,请不要讨厌。 我想为我的网站制作一个带有逻辑问题的验证码。我认为它比 reCaptcha 更好。无论如何,我用很多“谷歌搜索”做了一个花哨的代码,但它一定有一些错误,我也想知道,如何验证数据库中的答案。我的数据库如下所示:

id 问题答案

1 个例子?示例答案

我当前的代码是这样的:

<?php


  $database_db="general";
  $user_db="root";
  $password_db="somepass";
  $host_db="localhost";

  $link=mysql_connect($host_db,$user_db,$password_db) or die ("couldnot connect: ".mysql_error());
  mysql_select_db($database_db, $link)  or exit('Error Selecting database: '.mysql_error()); ;

  $query = "SELECT * FROM `captcha` ORDERED BY RAND() LIMIT 1";
  $question=mysql_query($query);
  $answer=$_POST["answer"];

  $errormessage = "";

  $sql="SELECT * FROM captcha where question='$question' and answer='$answer'";
  $result = mysql_query($sql, $link)  or exit('$sql failed: '.mysql_error()); 
  $num_rows = mysql_num_rows($result);
  if($num_rows==0){
  header("Location: error.php");
  } else {
  header("Location: success.php");
  exit;
  }
?>
<html>
    <body>
        <form method="post">
            <?php echo $question; ?>
            <input type="text" name="answer" id="answer" />
            <input type="submit" name="submit" value="submit" />
        </form>
    </body>
</html>

Success.php 是一个简单的文件,如果一切顺利,用户就会进入该文件,error.php 是一个包含以下代码的文件:

<?php echo "Captcha is not valid! Please try again"; ?>

另外请注意您会更改哪些内容来优化此代码。 如果它准备好了,我还有一个问题:如何在任何其他外部网站中实现它。

谢谢你的帮助,MLL

【问题讨论】:

    标签: php mysql sql captcha


    【解决方案1】:

    您似乎正在尝试在单个服务器生成的页面中提出问题并检查答案。一种更可行的方法可能是在一个页面上提出问题,然后通过后续请求/响应发布和检查答案。

    您确定您的“逻辑问题”计划吗?验证码如此普遍的原因之一是它们被设计为具有单一、明确、“正确”的答案。

    我担心你在问“什么动物追猫?”时可能会遇到问题。然后,您必须确定“狗”、“狗”、“狗”、“狗”、“热狗”、“狗鱼”、“拉布拉多”等哪些答案是“正确的”

    如果我误解了您的问题,我深表歉意。

    【讨论】:

    • 你帮忙写代码?非常感谢!我也很确定这一点。我会有一些问题,比如 abc 的第三个字母是什么。脚本准备好后我会提出问题
    • 在哪个字母表中?拉丁语、亚洲语、西里尔语、中东语?你的意思是“C”、“c”、“Ç”还是“ç”?您最终可能会将您的网站限制为仅限说英语的受众,或者仅限订阅与您相同的逻辑的受众。请重新考虑使用现成的验证码,这也将更容易实施。
    • 对不起。我会测试我的问题,但我的网站malamut.hu 完全是匈牙利语,所以我会用匈牙利语写问题。无论如何,谢谢你纠正我的错误:)
    【解决方案2】:

    为您快速清理代码(但未经测试)

    <?php
    
        $database_db="general";
        $user_db="root";
        $password_db="somepass";
        $host_db="localhost";
    
        $link = mysqli_connect($host_db, $user_db, $password_db, $database_db);
    
        /* check connection */
        if (mysqli_connect_errno()) 
        {
            die ("couldnot connect: ".mysqli_connect_error());
            exit();
        }   
    
        if (array_key_exists("answer", $_POST) AND array_key_exists("id", $_POST))
        {
            $id = intval($_POST['id']);
            $sql="SELECT question, answer FROM captcha WHERE question='$id' AND answer='".mysqli_real_escape_string($link, $answer)."'";
            $result = mysqli_query($link, $sql)  or exit('$sql failed: '.mysqli_error($link)); 
            $num_rows = mysqli_num_rows($result);
            if($num_rows==0)
            {
                header("Location: error.php");
            } 
            else 
            {
                header("Location: success.php");
            }
            exit;
        }
        else
        {
            $query = "SELECT id, question FROM `captcha` ORDER BY RAND() LIMIT 1";
            if ($result = mysqli_query($link, $query))
            {
                if ($row = mysqli_fetch_assoc($result)) 
                {
                    $id = $row["id"];
                    $question = $row["question"];
                }
            }
        }
    
    ?>
    <html>
        <body>
            <form method="post">
                <?php echo $question; ?><br />
                <input type="hidden" name="question" id="question" value="<?php echo $id; ?>" />
                <input type="text" name="answer" id="answer" /><br />
                <input type="submit" name="submit" value="submit" /><br />
            </form>
        </body>
    </html>
    

    添加了一些数据检查(您应该使用 mysqli_real_escape_string 以避免 SQL 注入 - 或强制输入为整数)。从 mysql_ 函数切换到 mysqli_ 函数。

    请注意,验证码中的漏洞是您存储了与表单中提出的问题/答案相关的内容。因此,一个狡猾的角色可能会用他们自己的固定选择覆盖您选择的随机角色。最好将问题存储在会话变量中

    毫无疑问,还有一些事情可以改变,但这些是我最初的改变。

    【讨论】:

    • 感谢您的快速回复!如果我在我的电脑上,我会测试这段代码。另外,HTML部分好吗?
    • 你真的应该在 HTML 中有一个标题标签等。文本输入字段的标签将帮助用户知道在哪里输入什么。你应该提出问题,可能还有一个代表问题的数字(即,问题 1 是某某,问题 2 是某某)。 @paul 提出的建议也值得牢记。也许值得拥有一个答案表并允许用户选择答案(大多数可能的答案都是错误的,所以你拒绝它们)。还应该指出 ORDER BY RAND() 有点慢,但在这样的小桌子上可能不是问题。
    • 谢谢!我会纠正他们。你建议什么而不是 ORDER BY RAND() ?
    • 对于这个行数非常有限的情况,我不会担心。但是,如果您想在论坛上随机发布一个包含数千个帖子的帖子,那么它就会成为一个问题。不过做起来相当复杂。一个可能有帮助的好帖子是stackoverflow.com/questions/1823306/…
    • 谢谢 :) 最好考虑未来。我也会纠正它:)
    猜你喜欢
    • 2020-08-07
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多