我需要幫助與我的網站的聯繫表格。我將首先解釋我的表單是如何設置的。我的網站有三個部分的單頁(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']) . "&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…" 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";
),所以我沒有其他地方尋找解決方案。
您相信您的普通人可以在沒有計算器的情況下將9乘以6或從49中減去32?我遇到了成年人,甚至無法在雜貨店經常計算他們的變化:p – skrilled
有人想讓事情變得複雜 – 2013-12-19 23:31:38