我遇到的问题是我的PHP邮件代码每天晚上11:30运行 。我确定没有人点击表单提交按钮。电子邮件内容为空。
在我的PHP邮件代码中,我将内容添加到数据库中以防电子邮件未通过,然后也发送电子邮件。
由于
形式:
<form action="background/mail.php" method="POST">
<div class="row">
<div class="six columns">
<label>Your email</label>
<input class="u-full-width" type="email" placeholder="example@validmail.com" name="email">
</div>
<div class="six columns">
<label>Reason for contacting</label>
<select class="u-full-width" name="reason">
<option>Inquiry</option>
<option>Order</option>
<option>Other</option>
</select>
</div>
</div>
<div class="row">
<div class="u-full-width">
<label>Message</label>
<textarea class="u-full-width" placeholder="Enter message here" name="message"></textarea>
<input class="button-primary" type="submit" value="Submit">
</div>
</div>
</form>
mail.php:
<?php
$to = "support@website.ca";
$reason = "CUSTOMER MAIL: " . $_POST['reason'];
$email = $_post['email'];
$msg = $_POST['message'] . "\nemail: " . $email;
$header = "MIME-Version: 1.0\r\n";
$header.= "Content-type: text/html\r\n";
$header.= "From: " . $email . "\r\n";
$header.= "Reply-to: support@website.ca\r\n" . "X-Mailer: PHP/" . phpversion();
require("login.php");
$sql = "INSERT INTO emails (email, message, reason) VALUES ('$email','$msg','$reason')";
if($conn->query($sql) === TRUE){
mail($to,$reason,$msg, $header);
echo "Added to database, mail sent.";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
答案 0 :(得分:2)
很可能有人直接向您的邮件脚本发出POST请求以发送电子邮件。有一些非万无一失的方法可以阻止这种情况:
添加一些检查POST请求的内容。例如没有空体,有效的电子邮件地址,其他逻辑检查。 (无论如何你应该这样做。)
在表单中添加一个空的其他隐藏字段。在mail.php中确认它是空的,以便继续。想法:抓取工具尝试填写所有表单字段,但用户不会填写隐藏的表单字段
添加隐藏字段并使用JS填充一些值并在mail.php中验证。爬虫不能使用Javascript,因此该字段将为空(缺陷:对于禁用JS的用户不起作用)。
任何这些都可以被规避,但它们实现起来很简单,并且使爬虫更加困难。
为了真正的安全性,有更复杂的解决方案。也许有人可以在答案中概述这些。
答案 1 :(得分:2)
As I stated in comments已经成为机器人(或许多机器人)的受害者;这是我用来阻止某些IP地址并在每个文件中用作包含的内容。
您还应检查empty()
字段,并对提交按钮使用isset()
。
以下不需要最后的第4组,但您可以随时添加它,因为它会检查第3组之后的任何内容。
您甚至可以将其缩小到只使用2套。
$ip = $_SERVER['REMOTE_ADDR'];
$nums = explode(".", $ip);
$if = "{$nums[0]}.{$nums[1]}.{$nums[2]}";
$blacklist = array(
"184.154.139",
"123.4.111",
"234.5.678"
);
if (in_array($if, $blacklist)) {
// echo "Rejected";
header("Location: http://www.example.com/");
exit;
}
else {
// Run your other code to do the variable check, mail processing etc.
}
I.e。:
命名您的提交按钮:
<input name="submit" class="button-primary" type="submit" value="Submit">
然后检查它是否已设置并且没有任何POST数组是(不)为空:
if(isset($_POST['submit'])){
if(!empty($_POST['reason']) && !empty($_POST['email'])){
$reason = $_POST['reason'];
$email = $_POST['email'];
// Run your executables in here
}
}
同样如上所述,您的现有代码向SQL injection开放。使用prepared statements或PDO与prepared statements。
另外,我在评论中提到的关于$_post
的语法错误需要大写$_POST
,因为它是一个超全局。