这是一个安全的PHP邮件函数吗?

这是一个安全的PHP邮件函数吗?,php,security,email,Php,Security,Email,我终于让这个PHP电子邮件脚本工作了(在localhost上不工作…),但我担心它不安全 那么-这对垃圾邮件和其他我不知道的安全隐患安全吗 <?php $email = 'notification@domain.com'; $subject = 'Notify about stuff'; $notify = $_REQUEST['email']; if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $notif

我终于让这个PHP电子邮件脚本工作了(在localhost上不工作…),但我担心它不安全

那么-这对垃圾邮件和其他我不知道的安全隐患安全吗

<?php
$email = 'notification@domain.com';
$subject = 'Notify about stuff';
$notify = $_REQUEST['email'];

if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $notify)) {
    echo "<h4>Your email address doesn't validate, please check that you typed it correct.</h4>";
    echo "<a href='javascript:history.back(1);'>Back</a>";
}

elseif(mail($email, $subject, $notify)) {
    echo "<h4>Thank you, you will be notified.</h4>";
} else {
    echo "<h4>Sorry, your email didn't get registered.</h4>";
}
?>

我不知道我是否使用
$\u服务器['HTTP\u REFERER']
返回。我觉得这可能会让你受到攻击,因为它是通过请求设置的。方法是使用上一页上的会话。这样,您就不会将不可信的数据转储到您的站点上


我不认为有任何安全风险,但我建议在检查电子邮件有效性时使用。这比摆弄资源容易多了。

我不知道我是否使用
$\u SERVER['HTTP\u REFERER']
返回。我觉得这可能会让你受到攻击,因为它是通过请求设置的。方法是使用上一页上的会话。这样,您就不会将不可信的数据转储到您的站点上


我不认为有任何安全风险,但我建议在检查电子邮件有效性时使用。这比使用REs要容易得多。

如果您想要接受所有有效格式的电子邮件地址并拒绝所有无效的电子邮件地址,那么您不能只使用regexp将电子邮件地址与短regexp模式进行匹配。使用实际针对相关RFC实现的解析器(,)来检查有效性

您可以做的其他事情是检查HTTP_REFERER,以确保请求来自您的域,正如Chacha102已经提到的那样。请注意,并不是所有代理都发送HTTP_REFERER,用户可以选择关闭或伪造它

如果您想进一步确保他们为您提供了有效的电子邮件地址,您可以检查指定域(a、MX或AAAA)中邮件服务器的现有DNS记录。除此之外,您还可以进行回调验证。这就是你连接邮件服务器的地方,告诉它你想发送到这个电子邮件地址,看看他们是否同意

对于回调验证,您应该注意greylisting服务器对所有内容都说OK,所以即使这样也不能保证。下面是我在需要这样一个脚本时使用的一些代码。它是来自()的解析器的补丁

#
#电子邮件回拨验证
#基于http://uk2.php.net/manual/en/function.getmxrr.php
#
if(strlen($bits['domain-literal'])){
$records=数组($bits['domain-literal']);
}elseif(!getmxrr($bits['domain'],$mx_records,$mx_weight)){
$records=数组($bits['domain']);
}否则{
$mxs=array();
对于($i=0;$i
如果要接受所有有效格式的电子邮件地址并拒绝所有无效的电子邮件地址,则不能仅将电子邮件地址与短regexp模式进行regexp匹配。使用实际针对相关RFC实现的解析器(,)来检查有效性

您可以做的其他事情是检查HTTP_REFERER,以确保请求来自您的域,正如Chacha102已经提到的那样。请注意,并不是所有代理都发送HTTP_REFERER,用户可以选择关闭或伪造它

如果您想进一步确保他们为您提供了有效的电子邮件地址,您可以检查指定域(a、MX或AAAA)中邮件服务器的现有DNS记录。除此之外,您还可以进行回调验证。这就是你连接邮件服务器的地方,告诉它你想发送到这个电子邮件地址,看看他们是否同意

对于回调验证,您应该注意greylisting服务器对所有内容都说OK,所以即使这样也不能保证。下面是我在需要这样一个脚本时使用的一些代码。它是来自()的解析器的补丁

#
#电子邮件回拨验证
#基于http://uk2.php.net/manual/en/function.getmxrr.php
#
if(strlen($bits['domain-literal'])){
$records=数组($bits['domain-literal']);
}elseif(!getmxrr($bits['domain'],$mx_records,$mx_weight)){
$records=数组($bits['domain']);
}否则{
$mxs=array();
对于($i=0;$i
+1用于筛选,不信任推荐人!使用前面提到的会话或重定向到用户应该来自的位置。谢谢,我不知道fi
<?php
$email = 'notification@domain.com';
$subject = 'Notify about stuff';
$notify = $_REQUEST['email'];

if (!filter_var($notify, FILTER_VALIDATE_EMAIL)) {
    echo "<h4>This email address ($notify) is not considered valid, please check that you typed it correct.</h4>";
    echo "<a href='javascript:history.back(1);'>Back</a>";
}

elseif(mail($email, $subject, $notify)) {
    echo "<h4>Thank you, you will be notified.</h4>";
} else {
    echo "<h4>Sorry, your email didn't get registered.</h4>";
}
?>
    #
    # Email callback verification
    # Based on http://uk2.php.net/manual/en/function.getmxrr.php
    #

    if (strlen($bits['domain-literal'])){
        $records = array($bits['domain-literal']);
    }elseif (!getmxrr($bits['domain'], $mx_records, $mx_weight)){
        $records = array($bits['domain']);
    }else{
        $mxs = array();

        for ($i = 0; $i < count($mx_records); $i++){
            $mxs[$mx_records[$i]] = $mx_weight[$i];
        }

        asort($mxs);

        $records = array_keys($mxs);
    }

    $user_okay = false;
    for ($j = 0; $j < count($records) && !$user_okay; $j++){
        $fp = @fsockopen($records[$j], 25, $errno, $errstr, 2);
        if($fp){
            $ms_resp = "";

            $ms_resp .= send_command($fp, "HELO ******.com");
            $ms_resp .= send_command($fp, "MAIL FROM:<>");

            $rcpt_text = send_command($fp, "RCPT TO:<" . $email . ">");
            $ms_resp .= $rcpt_text;

            $ms_code = intval(substr($rcpt_text, 0, 3));
            if ($ms_code == 250 || $ms_code == 451){ // Accept all user account on greylisting server
                $user_okay = true;
            }

            $ms_resp .= send_command($fp, "QUIT");

            fclose($fp);
        }
    }

return $user_okay ? 1 : 0;