【问题标题】:$_POST sometimes empty when sending mail发送邮件时 $_POST 有时为空
【发布时间】:2017-01-10 21:30:53
【问题描述】:

我有一个联系表单,通过电子邮件将提交的联系信息发送给我自己,但有时我收到一个空的 $_POST 数组,这导致我收到一封空的电子邮件。我使用验证器 JavaScript 文件来确保输入的字段不为空,并且我收到空电子邮件的唯一方法是让 $_POST 为空。我包含了包含表单、JavaScript 文件和 PHP 文件的代码。

我的表格:

        <div class="row contact-wrap"> 
            <div id="error-message" style="display: none;" ><p>ERROR</p></div>
            <form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php" data-toggle="validator" role="form">
                <div class="col-sm-5 col-sm-offset-1">
                    <div class="form-group">
                        <label for="inputname" class="control-label">NAME</label>
                        <input type="text" name="name" id="inputname" class="form-control" data-error="Name required!" required>
                    </div>
                    <div class="form-group">
                        <label for="inputemail" class="control-label">EMAIL</label>
                        <input type="email" name="email" id="inputemail" class="form-control" data-error="Email required!" required>
                    </div>                     
                </div>
                <div class="col-sm-5">
                    <div class="form-group">
                        <label for="inputsubject" class="control-label">SUBJECT</label>
                        <input type="text" name="subject" id="inputsubject" class="form-control" data-error="Subject required!" required>
                    </div>
                    <div class="form-group">
                        <label for="inputmessage" class="control-label">MESSAGE</label>
                        <textarea name="message" id="inputmessage" class="form-control" rows="8" data-error="Message required!" required></textarea>
                    </div>                        
                    <div class="form-group">
                        <button type="submit" name="submit" class="btn btn-primary btn-lg" required="required">SUBMIT</button>
                    </div>
                </div>
            </form> 
        </div>

    <script src="js/main.js"></script>
    <script src="js/validator.min.js"></script>

main.js JavaScript 文件来验证我的字段:

    jQuery(function($) {'use strict',
    var form = $('#main-contact-form')
    var message = $('#error-message')
    form.validator().on('submit', function (e) {
      if (e.isDefaultPrevented()) {
        message.fadeIn();
      } else {

        e.preventDefault();  
        $.ajax({
            type: "POST",
            url: $(this).attr('action'),
            data: form.serialize(),
            beforeSend: function(){
                form.prepend(
                    message
                        .html('<p>Sending...</p>')
                        .fadeIn()
                );
            }
        }).done(function(data){
           message.html('<p>' + data.message + '</p>').delay(2000).fadeOut();
           form.delay(2000).fadeOut();
           console.log("DONE");
        });
      }
    })
});

sendmail.php 文件我用来向自己发送表单数据:

<?php

// configure
$from = $_POST['email'];
$sendTo = 'my@email.com';
$fields = array('name' => 'Name', 'email' => 'Email', 'subject' => 'Subject', 'message' => 'Message');

try
{
    $emailText = "\n=============================\n";

    foreach ($_POST as $key => $value) {

        if (isset($fields[$key])) {
            $emailText .= "$fields[$key]: $value\n";
        }
    }

    mail($sendTo, $subject, $emailText, "From: " . $from);

    $responseArray = array('type' => 'success', 'message' => $okMessage);
}
catch (\Exception $e)
{
    $responseArray = array('type' => 'danger', 'message' => $errorMessage);
}

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    $encoded = json_encode($responseArray);

    header('Content-Type: application/json');

    echo $encoded;
}
else {
    echo $responseArray['message'];
}

【问题讨论】:

  • 您是在发送这些消息,还是它们似乎是随机发生的?
  • 我随机得到空消息,也就是说$_POST是空的。
  • 尝试使用 PHP 验证消息。用户可以删除您所做的验证或绕过它。 PHP 会让你抓住它。
  • 客户端验证是改善用户体验的好方法,但它不能替代服务器端验证。双方应始终进行验证。
  • 我很确定问题不在于用户没有输入任何数据,因为即使字段为空,我仍然会在收到的电子邮件中收到一些内容。问题是 $_POST 为空。

标签: javascript php forms post


【解决方案1】:

sendmail.php 中没有检查表明,如果满足这些条件,请发送电子邮件如果不满足这些条件,请不要发送电子邮件。目前,始终发送电子邮件。

某人或某物(蜘蛛、爬虫、Googlebot 等)正在直接访问 sendmail.php 而不提交表单。检查在sendmail.php提交:

if(!isset($_POST['submit'])) {
    die("Scumbag, use the form!");
}

或者检查每个提交的字段,因为有人也很容易将submit 或其他字段直接发布到您的脚本中。

如需更强大的功能,请参阅Cross-Site Request Forgeries,这也将对此有所帮助。

【讨论】:

  • 谢谢,在不提交表单的情况下直接访问 sendmail.php 是有道理的。我将添加服务器端验证,并且仅在存在必填字段时发送电子邮件。
猜你喜欢
  • 2018-05-09
  • 2020-02-29
  • 2012-09-11
  • 2014-09-03
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多