2013-12-19 55 views
0

我需要幫助與我的網站的聯繫表格。我將首先解釋我的表單是如何設置的。我的網站有三個部分的單頁(index.php)。最後一個是「聯繫我們」,它有一個表格,用戶應該輸入他們的姓名,電子郵件地址和信息。使用會話存儲答案反垃圾郵件查詢PHP聯繫表格

我的聯繫表格工作正常,但它需要一些針對垃圾郵件機器人的安全措施。所以我決定添加一個簡單的反垃圾郵件問題,例如「2 + 2」。我希望這個問題每次都會有所不同,這就是給我帶來問題的原因。如果您能指出我解決這個問題的正確方向,我會非常感激!

這是我正在使用的代碼。我會在下面解釋它。

<a name="contact"><h2>Contact Us</h2></a> 
<?php 
$operation = mt_rand(0, 2); 
switch ($operation) { 
    case 0: 
     $r1 = mt_rand(0, 50); 
     $r2 = mt_rand(0, 50); 
     $r3 = $r1 + $r2; 
     $query = "How much is $r1 + $r2?"; 
     break; 
    case 1: 
     $r1 = mt_rand(0, 50); 
     do { 
      $r2 = mt_rand(0, 50); 
     } while ($r2 >= $r1); 
     $r3  = $r1 - $r2; 
     $query = "How much is $r1 - $r2?"; 
     break; 
    case 2: 
     $r1 = mt_rand(0, 10); 
     $r2 = mt_rand(0, 10); 
     $r3 = $r1 * $r2; 
     $query = "How much is $r1 × $r2?"; 
     break; 
} 
if (isset($_POST["name"]) && isset($_POST["email"]) && isset($_POST["human"]) && isset($_POST["message"])) { 
    $name = spam_check('name'); 
    $from = spam_check('email'); 
    $subject = empty($_POST['subject']) ? "Contact Form Message" : spam_check('subject'); 
    $human = spam_check('human'); 
    $message = "<!DOCTYPE HTML><html><body><p>"; 
    $message .= "<strong>Name:</strong> " . $name . "<br>"; 
    $message .= "<strong>Email:</strong> <a href=\"mailto:" . $from . "\">" . $from . "</a></p>"; 
    $message .= "<p><strong>Message:</strong><br>" . spam_check('message') . "</p>"; 
    $message .= "</body></html>"; 
    $to  = "hell[email protected]"; 
    $headers = "From: Me<[email protected]>\nReply-To:" . $name . "<" . $from . ">\n"; 
    $headers .= "Mime-Version: 1.0\n"; 
    $headers .= "Content-Type: text/html; charset=UTF-8"; 
    if ($_POST['submit']) { 
     if (!strcmp($human, $_SESSION['human'])) { 
      if (mail($to, $subject, $message, $headers)) { 
       echo "<p class=\"success\">Thanks for contacting us.</p>"; 
      } else { 
       echo "<p class=\"failure\">Something went wrong, please try again!</p>"; 
      } 
      unset($_SESSION['query']); 
      unset($_SESSION['human']); 
     } else { 
      echo "<p class=\"warning\">You did not answer our anti-spam question. Do you need <a href=\"http://www.google.com/search?q=" . urlencode($_SESSION['query']) . "&amp;hl=en\">help</a>?</p>"; 
     } 
    } else { 
     echo "<p class=\"failure\">Something went wrong, please try again!</p>"; 
    } 
} 
if (!isset($_SESSION['human'])) { 
    $_SESSION['query'] = $query; 
    $_SESSION['human'] = "$r3"; 
} ?> 
<form action="#contact" method="post"> 
    <input type="text" name="name" placeholder="Name" title="Name" required> 
    <input type="email" name="email" placeholder="Email" title="Email" required> 
    <input type="text" name="subject" placeholder="Subject" title="Subject"> 
    <input type="text" name="human" placeholder="<?php echo $query; ?>" title="<?php echo $query; ?>" required> 
    <textarea name="message" placeholder="Write your message here&hellip;" title="Message" rows="10" cols="40" required></textarea> 
    <input type="submit" name="submit" value="Send"> 
</form> 

這裏是我想要實現與上面的代碼的解釋:首先,我產生一個隨機數來決定,如果這個問題將是一個加法,減法或乘法。如果我得到:

  • ,我產生低於50兩個隨機數並添加他們。我會在50以下產生兩個隨機數並減去它們(注意:第二個數不能大於第一個以防止出現負面結果)。
  • ,我生成兩個10以下的隨機數並乘以它們。

問題的結果存儲在$r3中,問題本身存儲在$query中。

接下來,我檢查用戶是否提交了表單。如果他們有,我使用名爲spam_check的函數提取他們的輸入。 spam_check應該停止標題注入。它似乎工作,雖然我沒有徹底測試它。一旦我提取了每個字段的值,我就開始構建電子郵件的正文和標題。這也適用。堅持下去,我們即將解決問題。

下一步是檢查用戶對反垃圾郵件問題($human)的答案是否與$r3的值匹配。這是我無法工作的部分。我曾經有一個簡單的檢查:$human == $r3,但我很快意識到它不會工作,因爲一旦您提交表單,頁面重新加載並$r3成爲一個新的數字。所以我決定可能會議是走出去的路。

在最後一行中,如果$_SESSION['human']未設置(例如,第一次加載頁面),則$r3的值將存儲在$_SESSION['human']中。要確定用戶是否正確回答我使用!strcmp($human, $_SESSION['human']),但它不起作用,因爲$_SESSION['human']不存儲值!

它看起來像一旦你提交表單,會話在某種程度上丟失,存儲的值被重置。我如何儲存和保存$r3的價值?

我已經檢查過會話是否在我的服務器中啓用,並且我還找到了臨時會話文件(例如,query|s:20:"How much is 19 - 12?";human|s:1:"7";),所以我沒有其他地方尋找解決方案。

+0

您相信您的普通人可以在沒有計算器的情況下將9乘以6或從49中減去32?我遇到了成年人,甚至無法在雜貨店經常計算他們的變化:p – skrilled

+0

有人想讓事情變得複雜 – 2013-12-19 23:31:38

回答

0

你可能需要在你的代碼開始時運行

session_start(); 

。有關更多信息,請參閱http://www.php.net/session_start。注意,你應該把session_start()放在任何其他輸出到瀏覽器之前。

+0

不幸的是,情況並非如此。我已經把它作爲我的第一行了。 – richi3f