PHP邮件脚本每晚自动运行同一时间

时间:2016-04-27 17:06:25

标签: php email

我遇到的问题是我的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();

?>

2 个答案:

答案 0 :(得分:2)

很可能有人直接向您的邮件脚本发出POST请求以发送电子邮件。有一些非万无一失的方法可以阻止这种情况:

  1. 添加一些检查POST请求的内容。例如没有空体,有效的电子邮件地址,其他逻辑检查。 (无论如何你应该这样做。)

  2. 在表单中添加一个空的其他隐藏字段。在mail.php中确认它是空的,以便继续。想法:抓取工具尝试填写所有表单字段,但用户不会填写隐藏的表单字段

  3. 添加隐藏字段并使用JS填充一些值并在mail.php中验证。爬虫不能使用Javascript,因此该字段将为空(缺陷:对于禁用JS的用户不起作用)。

  4. 任何这些都可以被规避,但它们实现起来很简单,并且使爬虫更加困难。

    为了真正的安全性,有更复杂的解决方案。也许有人可以在答案中概述这些。

答案 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 statementsPDOprepared statements

另外,我在评论中提到的关于$_post的语法错误需要大写$_POST,因为它是一个超全局。