0

我正在构建我的联系表单电子邮件地址验证脚本。调试它并使用所有通过的有效电子邮件地址运行基本测试后,我继续测试无效地址。我的第一个测试是.ala.dom.com明显无效的起始点和结束点。我希望得到我的错误信息。然而; 我的主机已将其设置为magic_quotes打开,而电子邮件却通过了,因为地址的整个本地部分都用“这样的”进行了转义".ala."@dom.com

这是到达电子邮件收件箱的实际标题的摘录 -

Received: by srv28.000webhost.com (Postfix, from userid 7695918)
    id 899601EE9C2; Sat, 5 Oct 2013 16:21:37 -0400 (EDT)
To: net@weedy101.netii.net
Subject: Should fold
X-PHP-Script: weedy101.netii.net/new-mail.php for 2.26.7.205
From: ".ala."@dom.com
Reply-To: ".ala."@dom.com
Content-type: text/html
Message-Id: <20131005202137.899601EE9C2@srv28.000webhost.com>
Date: Sat, 5 Oct 2013 16:21:37 -0400 (EDT)

我的主机000webhosts.com有一个免费帐户,所以即使他们只使用php 5.2.*我也无法访问php.ini来更改设置,因此我需要以编程方式去除插入的字符,或者找到另一种解决方法。我完全不知道如何最好地处理这个问题。我的验证脚本是 -

<?php
if (isset($_POST['name']) && isset($_POST['message']) && isset($_POST['email']) && isset($_POST['subject'])) {

    $name = $_POST['name'];
    $text = $_POST['message'];
    $contact = $_POST['email'];
    $subject = $_POST['subject'];
    $isValid = true;
    $atIndex = strrpos($contact, "@");
    $problem = 1;

    if (is_bool($atIndex) && !$atIndex) {

        $isValid = false;
        $problem = 2;

    }
    else {

        $domain = substr($contact, $atIndex+1);
        $local = substr($contact, 0, $atIndex);
        $localLen = strlen($local);
        $domainLen = strlen($domain);

        if ($localLen < 1 || $localLen > 64) {

            $isValid = false;
            $problem = 3;

        }
        else if ($domainLen < 1 || $domainLen > 255) {

            $isValid = false;
            $problem = 4;

        }
        else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {

            $isValid = false;
            $problem = 5;

        }
        else if (preg_match('/\\.\\./', $domain)) {

            $isValid = false;
            $problem = 6;

        }
        else if (!(checkdnsrr($domain,"MX") || checkdnsrr($domain, "A"))) {

            $isValid = false;
            $problem = 7;

        }
        else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%£`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) {

            if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) {

                $isValid = false;
                $problem = 8;

            }
            else if ($local[0] == '.' || $local[$localLen-1] == '.')

                $isValid = false;
                $problem = 9;

            }
            else if (preg_match('/\\.\\./', $local)) {

                $isValid = false;
                $problem = 10;

            }
        }
    }
    else {

        $problem = 11;

}
    if ($isValid == true) {

        $message = "Message : <br/>" .$text . "<br/><br/>" . "From: " . $name . "<br/>" . $contact;
        $headers = 'From: '. $contact . "\r\n" . 'Reply-To: ' . $contact . "\r\n" . "Content-type: text/html\r\n";
        $mailto = 'net@weedy101.netii.net';
        mail($mailto, $subject, $message, $headers );

    }

header('location: index.php?pass='.$problem);
?>

随意调整它,因为我正在从http://www.linuxjournal.com/article/9585?page=0,0上的文章“使用 PHP 验证电子邮件地址,正确的方式”中调整它

<EDIT>

在完成了这里提供的所有帮助并完成了许多导致我仍然卡住的实验之后。虽然我可以通过逐字复制http://www.linuxjournal.com/article/9585?page=0,0上的原始参考文章示例来完成工作,这一切都很好,但我不能做的是调整它除了更改会破坏对象的预匹配字符串之外。因此,如果有人能找到一种方法来使其更具适应性,即作为外部函数或类可移植,以便可以随意重用。我将非常感谢您的帮助。

所以我将把它标记为已回答,但会继续阅读评论和任何新答案,希望有一天能够理解究竟是什么阻止了这个子程序被分离出来并更灵活地使用。

4

3 回答 3

0

根据我的问题的新编辑。

感谢所有提供帮助的人,非常感谢,不幸的是,我未能使这个子程序可移植和灵活。我能够实现它的唯一方法是按照 linuxjounal.com http://www.linuxjournal.com/article/9585?page=0,0上的原始文章逐字逐句

在我的临时主页http://weedy101.netii.net/上有一个这个验证子例程的工作示例,一定要试试这个,如果可以的话,也给我一两行指导。

对于任何感兴趣的人,我通过在索引页面的 head 元素内的 php 标记内调用 textarea 的 ::-webkit-input-placeholder (加上 -moz- 和 -ms- 等效项)来更改占位符文本颜色,因此 -

<head>

<?php
    if ($problem <> 1)
    {?><style type="text/css">
    <!--
    textarea::-webkit-input-placeholder { background: #ffffff; color: #ff0000!important; }
    textarea:-moz-placeholder { background: #ffffff; color: #ff0000!important; }
    textarea::-moz-placeholder { background: #ffffff; color: #ff0000!important; }
    textarea:-ms-input-placeholder { background: #ffffff; color: #ff0000!important; }
    -->
    </style><?php } ?>
于 2013-10-08T15:25:11.697 回答
0

文档中有一个示例代码:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
于 2013-10-05T20:59:54.960 回答
0

你知道filter_var函数吗?

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));

它并不完美,但比你做得更好......

PS:要先验证电子邮件filter_var,然后在此处使用此方法 (不是我的网站,而是首先在 google 中出现的 php validate mx)checkdnsrr如果您想确保域可以实际处理电子邮件。如果没有找到 MX 记录,则可以安全地假设电子邮件不会到达它。或者尝试蛮力端口 25 套接字连接只是为了确定。

于 2013-10-05T21:10:01.187 回答