php get_magic_quotes_gpc()如何删除插入的转义字符?

时间:2013-10-05 20:57:23

标签: php validation email magic-quotes-gpc

我正在构建联系表单电子邮件地址验证脚本。调试它并使用所有通过的有效电子邮件地址运行基本测试我继续测试无效地址。我的第一个测试是.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逐字复制原始参考文章示例来完成工作,但这一切都很好,我不能做的就是调整它而不是更改preg匹配字符串,无论如何都会打败对象。因此,如果任何人都能看到一种方法来使其更具适应性,即作为外部函数或类可移植,那么它可以随意重用。我非常感谢你的帮助。

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

3 个答案:

答案 0 :(得分:0)

直接有一个示例代码in the documentation

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);
}

答案 1 :(得分:0)

您确实知道filter_var功能吗?

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

这不是完美的,但比你做得更好......

PS :首先验证电子邮件filter_var,然后使用this method here (不是我的网站,但首先是google for php validate mx)如果您想确保域名可以实际处理电子邮件,请使用checkdnsrr 。如果没有找到MX记录,则可以安全地假设电子邮件无法访问它。或者尝试使用强力端口25插座连接,只是为了确定。

答案 2 :(得分: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 } ?>