电子邮件地址验证过滤器

3

我知道这个话题以前已经讨论过了,但是自从2010年底这篇帖子和其他相关讨论引发问题时 - FILTER_VALIDATE_EMAIL能使字符串安全地插入数据库吗? - 我尝试了一些描述的情况,例如在使用FILTER_VALIDATE_EMAIL的电子邮件表单中使用单引号和`字符,并阻止它们进入数据库。

最近的PHP版本是否修复了早期的问题并且是安全的?

我想同时使用mysql_real_escape_string(),也许两个函数可以并行使用而不会出现冲突?

这是我用来将地址放入数据库的邮件列表代码

    <?php
// connects the database access information this file
include("mailing_list_include.php");

// the following code relates to mailing list signups only
if (($_POST) && ($_POST["action"] == "unsub")) {
// trying to ubsubscribe; validate email addresses
if ($_POST["email"] == "") {
    header("Location: mailing_list_remove.php");
    exit;

} else {
    // connect to database
    doDB();

    // filtering out anything that isn't an email address
    if ( filter_var(($_POST["email"]), FILTER_VALIDATE_EMAIL)  == TRUE) {
        echo '';
    } else {
        echo 'Invalid Email Address';
        exit;
    }

    // check that email is in the database
    emailChecker($_POST["email"]);

    // get number of results and do action
    if (mysqli_num_rows($check_res) < 1) {
        // free result
        mysqli_free_result($check_res);

        // print failure message
        $display_block = "We couldn't find ".$_POST["email"].". No action has therefore been taken.";

    } else {
        // get value of ID from result
        while ($row = mysqli_fetch_array($check_res)) {
            $id = $row["id"];
        }

        // unsubscribe the address
        $del_sql =  "DELETE FROM subscribers
                    WHERE id = '".$id."'";
        $del_res =  mysqli_query($mysqli, $del_sql)
                    or die(mysql_error($mysqli));
        $display_block = " Your email address, ".$_POST["email"].", is unsubscribed!";
    }
    mysqli_close($mysqli);
}
}
?>
<html>
<?php echo "$display_block";?>
</html>

1
你应该始终使用mysql_real_escape_string来处理任何要存入数据库的字符串数据。 - Brian Driscoll
8
最好始终使用预处理语句。 - knittl
我会研究一下预处理语句,这个技术我以前没用过。 - Andy
1个回答

3
FILTER_VALIDATE_EMAIL 是一个过滤器选项,用于验证电子邮件格式是否正确,如果不是,则返回false。
您可能正在寻找的是FILTER_SANITIZE_EMAIL,它将删除所有字符(除了字母、数字和!#$%&'*+-/=?^_`{|}~@.[])。
或者使用FILTER_SANITIZE_STRING将删除标签,可选择删除或编码特殊字符。
虽然我不建议使用 w3schools,但它有一个 filter_var 标志列表,网址为:http://www.w3schools.com/php/php_ref_filter.asp 另外,正如其他人所说,要保证安全性,可以使用 PDO 的预处理查询。在这里可以找到一个很好的 pdo 示例:http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html#10,它将解释一些事情。此外,在这里还有一个简单的 PDO CRUD(创建检索更新删除)类:http://www.phpro.org/classes/PDO-CRUD.html 祝好运...

这是一个邮件列表,只有一个字段用于输入电子邮件地址。因为我刚开始学习PHP,很多东西对我来说都是新的。在这种情况下,你会如何使用准备好的查询? - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接