0


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

身份证问题答案

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

4

2 回答 2

1

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

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

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

如果我误解了您的查询,我深表歉意。

于 2013-04-16T12:29:11.897 回答
0

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

<?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_ 函数。

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

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

于 2013-04-16T12:37:07.200 回答