2010-01-27 161 views
10

是否有相当于mysql_real_escape_string()用于电子邮件注入?我有一个表单,用户提交他们的电子邮件。恐怕有人可以插入逗号分隔的电子邮件列表并使用我的网站发送垃圾邮件。PHP电子邮件验证功能

+0

将其推送到this regex。 – 2010-01-27 11:17:51

回答

31

您可以使用filter_var验证的电子邮件地址:

if (!filter_var($address, FILTER_VALIDATE_EMAIL)) { 
    // invalid e-mail address 
} 
+0

确保只有一个电子邮件地址吗? – Brian 2010-01-27 11:23:41

+0

@Brian:是的,如果你测试一个像user-a @ example.com,user-b @ example.com这样的字符串,它会返回* false *。 – Gumbo 2010-01-27 11:25:22

+4

使用本机函数+1 +1 – Gordon 2010-01-27 11:25:46

2

只需验证方面对单的电子邮件地址

function validate_email($e){ 
    return (bool)preg_match("`^[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$`i", trim($e)); 
} 
0

如果您主要关注的是一个常见的正则表达式,如问题所述,为了验证用户是否没有试图通过输入逗号分隔的地址列表来欺骗您发送垃圾邮件,那么仅仅检查用户输入中是否有逗号并不是明显的答案?

1

对于那些与旧版本

/* 
    # PHP Email Validation for versions LESS than PHP 5.2.0) 
*/ 
$strEmail= mysql_real_escape_string($_POST['email_e']); 
if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$", $strEmail)){ 

     // valid email 

     } else { 

     // not a valid email 
} 
+2

自PHP 5.3起eregi ist折旧 – Gerfried 2016-01-26 08:30:20

+0

感谢您的评论。 Dully指出。 – TheBlackBenzKid 2016-01-26 11:53:00

0

我发现,良好的电子邮件验证并非如此简单,所以才决定是否“@”和“”在字符串中。

function email_valid($email){ 
    /* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "." */ 

    if(strpos($email, "@") AND strpos($email, ".")){ 
     return TRUE; 
    } 
    else { 
     return FALSE; 
    } 
} 

P.S.如果您不使用PDO准备好的语句写入数据库,请确保过滤掉可能导致sql注入的符号

+0

你至少可以确定'。'位置比'@'大。我仍然认为可以用正则表达式创建更好的验证。 – patricia 2013-07-24 12:06:52

+0

实际上,电子邮件甚至可能不包含“。”,例如Intranet中的“user @ hostname”应该完全可用 – Victor 2017-09-14 09:26:51

+0

@Victor的确如此。经过几年的编程以来,我最初回答了这个问题,我得出结论认为,比<'更多地验证电子邮件地址是不值得的。您关心的是,如果用户可以收到您的电子邮件,即使使用有效的电子邮件地址,也可能无法发送,因此只需发送确认电子邮件而不是写入验证码就简单多了。 – Tomas 2017-09-14 10:23:02

0

检查总字符串长度会更简单 - 即本地部分最大64 + @域部分最多255个字符= 320个字符,但是然后垃圾短小地址仍然是可能的。我目前正在研究我的项目的电子邮件验证,并发现了这个有趣的文章email validation,它解释了深入的有效电子邮件地址和rfc2822。在那里,他们提出了一种更简单的验证方法,可以避免逗号分隔列表成为垃圾邮件的有效形式。

$isValid = true; 
$atIndex = strrpos($email, "@"); 
if (is_bool($atIndex) && !$atIndex) 
{ 
    $isValid = false; 
} 
else 
{ 
    $domain = substr($email, $atIndex+1); 
    $local = substr($email, 0, $atIndex); 
    // ... work with domain and local parts 
} 

这只是通过找到最后一个@符号打破了电子邮件地址下来,所有声明之前经过它是具有64个字符的限制地址的本地部分。如果没有@符号,则strrpos将返回一个布尔值false。我将在我的验证功能中使用这个。