【问题标题】:PHP email validation function [duplicate]PHP电子邮件验证功能[重复]
【发布时间】:2011-01-09 22:04:56
【问题描述】:

是否有与 mysql_real_escape_string() 等效的电子邮件注入?我有一个用户提交电子邮件的表单。我担心有人会插入以逗号分隔的电子邮件列表并使用我的网站发送垃圾邮件。

【问题讨论】:

标签: php


【解决方案1】:

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

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

【讨论】:

  • 那能保证只有一个邮箱吗?
  • @Brian: 是的,如果你测试像user-a@example.com,user-b@example.com 这样的字符串,它会返回false
  • +1 使用原生函数
  • filter_var() 是否允许创建自定义验证标志?我正在考虑应用它来检查数据库中值的唯一性。或者这不是一个好主意?
  • 在技术上当然是最好的答案。但是 FILTER_VALIDATE_EMAIL 会告诉以下电子邮件地址是有效的:my$sd/f+sdf@domain.com-com-com-com 我的大多数客户都喜欢过滤掉这些地址,所以我仍然给preg_match 一个机会。
【解决方案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));
}

【讨论】:

    【解决方案3】:

    对于那些使用旧版本的人

    /*
        # 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
    }
    

    【讨论】:

    • 从 PHP 5.3 开始贬值的文件
    • 感谢您的评论。记不清了。
    【解决方案4】:

    如果您主要关心的是,如问题所述,验证用户没有试图通过输入逗号分隔的地址列表来欺骗您为他们发送垃圾邮件,那么简单地检查是否存在用户输入中有逗号吗?

    【讨论】:

      【解决方案5】:

      我发现好的电子邮件验证并不是那么简单,所以决定检查“@”和“.”。在字符串中。

      function email_valid($email){
          /* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "."  */
      
          if( strpos($email, "@") AND strpos($email, ".") ){
              return TRUE;
          }
          else {
              return FALSE;
          }
      }
      

      附:如果您不使用 PDO 准备语句写入数据库,请务必过滤掉可能导致 sql 注入的符号

      【讨论】:

      • 你至少可以确定'.'位置大于“@”。我仍然认为可以使用正则表达式创建更好的验证。
      • 实际上,电子邮件甚至可能不包含“.”,例如内网中的“user@hostname”应该是完全可用的
      • @Victor 这是真的。自从我最初回答这个问题以来,经过几年的编程,我得出的结论是,验证电子邮件地址不值得超过<input type="email" />。您关心的是用户是否可以收到您的电子邮件,即使使用有效的电子邮件地址也可能无法收到,因此发送确认电子邮件而不是编写验证码要简单得多。
      【解决方案6】:

      检查总字符串长度会更简单 - 即本地部分最多 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。我将在我的验证功能中使用它。

      【讨论】:

        猜你喜欢
        • 2011-06-21
        • 2011-04-06
        • 2016-05-12
        • 2011-01-22
        • 2011-03-30
        • 2011-07-16
        • 1970-01-01
        • 2011-04-22
        • 2013-09-25
        相关资源
        最近更新 更多