>我为一个网站整理了一个简单的PHP电子邮件表单,但它经常发送空白电子邮件。大多数字段都是"必填的",我使用验证码系统有一段时间了,但空白电子邮件不断出现。
HTML 标记:
<form action="mail_send.php" method="post">
<input name="name" type="text" required="required" size="40" />
<input name="email" type="text" required="required" size="40" />
<input name="company" type="text" size="40" />
<textarea name="message" cols="80" rows="7" required="required"></textarea>
<input type="submit" value="Submit" />
</form>
.PHP:
$name = $_POST['name'];
$email = $_POST['email'];
$company = $_POST['company'];
$message = $_POST['message'];
$formcontent=" FROM:'n $name 'n'n COMPANY:'n $company 'n'n MESSAGE:'n $message";
$recipient = "email address";
$subject = "Subject";
$mailheader = "From: $email 'r'n";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
echo "<script>window.location = 'confirmation.php'</script>";
当我测试它时,一切正常,我从表单收到电子邮件完全没有问题,但由于某种原因,我经常收到空白电子邮件(可能来自机器人)。
有什么想法吗?
谢谢!
如果您的 HTML 表单和 PHP 位于同一个文件中,而您没有检查这些输入中的任何一个是否为空,则可能会发生这种情况。如果不在同一文件中,不检查空性仍然适用。
您可能是机器人的受害者,或者一些经常访问您网站的小丑只是为了打勾您。
或者表单方法的 URL 被某人或某事直接访问,这就是我觉得这可能是这里的问题,因为您的输入确实有required
。
- 检查您的访问日志。
因此,请对所有输入使用条件!empty()
。
- http://php.net/manual/en/function.empty.php
即:
旁注:||
检查一个或任何一个是否为空。
if( !empty($_POST['name']) || !empty($_POST['email']) ){
$name = $_POST['name'];
$email = $_POST['email'];
// process mail
}
您可以添加其他的。
或者为您的提交指定一个名称属性:
<input name="submit" type="submit" value="Submit" />
然后检查按钮是否已设置并且输入是否不为空:
if(isset(_POST['submit'])){
if(!empty($_POST['name']) || !empty($_POST['email']) ){
$name = $_POST['name'];
$email = $_POST['email'];
// process mail
}
}
您还应该使用过滤器来输入电子邮件:
- http://php.net/manual/en/function.filter-var.php
- http://php.net/manual/en/filter.examples.validation.php
另外,如果您决定稍后使用收音机/复选框,请使用isset()
来对付这些收音机/复选框。
旁注:
您可以在表单中添加一个复选框以检查它是否已选中,并使用条件语句处理它。
脚注:
"大多数字段都是'必填的',我使用验证码系统有一段时间了,但空白电子邮件不断出现。"
您的问题中没有任何验证码来支持这一点。
注:
必需属性仅适用于支持 HTML5 的浏览器。因此,如果这些机器人或您网站的访问者中的任何一个使用的浏览器不支持HTML5,或者可以绕过它的技术,那么这也可能是另一个(贡献)因素。
您需要对PHP进行验证。
http://www.w3schools.com/php/php_form_validation.asp
基本上,您需要执行以下操作:
安全
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
验证
if (!empty($email)){
//your code to send email
}
如果您想检查不止一件事,您可以使其更复杂一些。
$fail_validation = FALSE;
if (empty($email)){
$fail_validation = TRUE;
}
if (empty($phone)){
$fail_validation = TRUE;
}
if ($fail_validation == FALSE){
//code to send mail goes here
}
请注意,这是非常基本的,您可能需要考虑研究一些额外的功能来保护 PHP。 我还建议使用蜜罐作为额外的安全层。https://stackoverflow.com/a/22103646/2547075
<textarea name="message" cols="80" rows="7" required="required"></textarea>
应该是
<textarea name="message" cols="80" rows="7" required></textarea>
你是在写XHTML还是HTML?
还建议在服务器端进行验证。请参阅下面有关如何操作的答案。
但是由于某种原因,您会收到空白电子邮件,可能来自机器人。
几乎回答了你的问题。机器人可以非常先进,也可以破解某些验证码来发布空白的帖子请求。您应该检查发布请求是否不为空。
牢不可破的验证码是你自己写的验证码(在网站流行之前不会传播)或最近从谷歌推出的验证码。 试一试(一旦你检查了空值)