2013-04-16 35 views
0


這是我的第一篇文章,所以不要討厭如果我以錯誤的方式做某件事。 我想用邏輯問題爲我的網站做一個驗證碼。我認爲它比reCaptcha更好。無論如何,我用很多「谷歌」做了一個奇特的代碼,但它肯定會犯一些錯誤,我也想知道,如何從數據庫驗證答案。我的數據庫看起來是這樣的:從SQL表和外部檢查的邏輯驗證碼

ID問題答案

1的例子嗎? exampleanswer

我當前的代碼是這樣的:

<?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

回答

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_函數。

請注意驗證碼中的空洞是您存儲的內容與表單中提出的問題/答案有關。因此,一個狡猾的角色可以用你自己的固定選擇來寫出你選擇的隨機角色。更好地將問題存儲在會話變量中

毫無疑問,可以更改一些東西,但這些是我最初的更改。

+0

謝謝你的快速回復!如果我在我的電腦上,我會測試這個代碼。另外,HTML部分是好的嗎? – MLL

+0

你應該在HTML中擁有一個標題標籤等。文本輸入字段的標籤將幫助用戶知道在哪裏輸入。你應該提出這個問題,可能是一個代表問題的數字(即問題1是如此這般,問題2是如此)。 @paul提出的建議也值得銘記。也許值得擁有答案表並允許用戶選擇答案(大多數可能的答案都是錯的,所以你拒絕答案)。還應該指出,ORDER BY RAND()有點慢,但可能不是像這樣的小表上的問題。 – Kickstart

+0

謝謝!我會糾正它們。你有什麼建議而不是RAND(ORDER BY)()? – MLL

1

它看起來像你想都提出一個問題,並在單臺服務器生成的頁面中選中了答案。如果在一個頁面上詢問問題,並且通過隨後的請求/響應發佈和檢查答案,則更可行的方法可能是。

你確定你的'邏輯問題'計劃嗎?驗證碼如此普遍的原因之一是它們被設計爲具有單一的,明確的,「正確」的答案。

我擔心你在問'貓是什麼動物追逐貓?'時可能會遇到問題。然後,您必須確定「狗」,「狗」,「狗」,「狗」,「熱狗」,「角鯊」,「拉布拉多犬」等哪些答案是「正確的」

如果我誤解了你的查詢,我很抱歉。

+0

範你幫忙的代碼?非常感謝你!我對此也很肯定。我會遇到類似於abc第三個字母的問題。腳本準備就緒時我會提問 – MLL

+0

在哪個字母表中?拉丁語,亞洲,西里爾文,中東?你的意思是'C','c','Ç'還是'ç'?您可能最終將您的網站限制爲只會說英語的受衆,或者只限定符合您的相同邏輯的受衆羣體。請重新考慮使用現成的驗證碼,這也將更容易實施。 – paul

+0

對不起。我會測試我的問題,但我的網站http://malamut.hu完全是匈牙利語,所以我會用匈牙利語寫問題。無論如何,謝謝你糾正我的錯誤:) – MLL