为了账号安全,请及时绑定邮箱和手机立即绑定

老司机们为什么不用正则表达式来验证邮箱?

解释:
这个标题既通俗易懂,又符合中文的口语表达习惯。用“老司机”来指代经验丰富的开发者,更显得亲切自然;同时,直接点出了文章的核心问题——为什么不用正则表达式来做邮箱验证。

那个没人谈论的棘手问题

说实话:电子邮件验证听上去很简单,但实际上却是个技术陷阱,连有经验的开发者也会踩到坑里。

到底发生了什么事?

想象你在创建一个注册表单。你可能首先会想到对电子邮件验证使用正则表达式,这真是个糟糕的决定哦。

奇怪的邮件

    # 下面这些邮箱地址都是有效的!
    valid_emails = [
        '"J. R. \"Bob\" Dobbs"@example.com',  # 这样的格式是有效的
        'admin@mailserver1',  # 简单的邮箱格式也是有效的
        'user+tag@gmail.com',  # 包含加号的邮箱地址也是有效的
        'postmaster@[123.123.123.123]'  # 包含IP地址的邮箱也是有效的
    ]

全屏 全屏退出

大多数正则表达式引擎在这种情况下都会卡壳。

为啥?

电子邮件的标准真是五花八门。

大多数开发人员可能会惊讶地发现,这些实际上根据RFC 5322标准是有效的电子邮件地址。该标准允许。

  • 引用的本地部分内容
  • 括号内的注释
  • 嵌套的注释内容
  • 本地部分中的特殊字符处理
  • 多个域名标签处理
不良验证的隐藏成本

1. 失去真实用户

严格的正则表达式可能会把一些完全有效的电子邮件地址当成“怪异的”给拒绝了。想象因为某人的电子邮件看起来“奇怪”,比如像这样的:

  • 123456@example.com

(注:原文中并未提供具体示例,以上仅为说明。)

你的产品团队会特别不高兴,更别说销售那边更是火大。

2. ReDoS 攻击事件 (gōngjī shìjiàn)

使用回溯算法的正则表达式引擎容易遭受拒绝服务式正则表达式攻击(ReDoS)。

    def dangerous_regex_check(user_input):
        ## 这种正则表达式可能会拖垮你服务器的性能
        evil_pattern = r'^(a+)+b

全屏,退出全屏

黑客可以通过构造恶意数据让您的验证程序卡住甚至停止运行。

## 更聪明的做法

### 真正管用的基本验证
def smart_email_check(email):
    """简单粗暴的电子邮件检查"""
    return (
        email and 
        '@' in email and 
        len(email) <= 254  # Email length limit
    )

进入全屏 退出全屏

### 真正的解决方案:验证

1. 基本语法检测
2. 发送验证邮件中的链接
3. 让用户证明邮箱可以正常使用

def 验证电子邮件地址(电子邮件):
如果 not 基本电子邮件检查(电子邮件):
返回 False

# 发送验证邮件和令牌
token = 生成唯一令牌()
发送验证电子邮件(电子邮件, token)

return True

全屏模式 退出全屏

## Pro Tools for 专业开发者

与其编写自己的正则表达式,不如使用经过测试的库

* Python: `email-validator`
* JavaScript: `validator.js`
* Java: 使用 Apache Commons 校验器

## 更棒的验证类:

class EmailValidator:
@staticmethod
def validate(email):
"""
智能邮件检查

  • 快速语法审核
  • 验证是否可以送达
    """
    try:
    使用智能的库
        validate_email(
            email,
            check_deliverability=True
        )
        return True
    except EmailInvalidError:  # (电子邮件无效错误)
        return False

全屏 全屏退出

核心要点

邮箱验证过程并不是为了建立一个无法攻破的防线,而是:

  • 让真正的用户进来
  • 确保系统安全
  • 不要把事情搞复杂
要点.
  1. 忘记复杂的正则表达式规则
  2. 用经过验证的库
  3. 发送验证邮件
  4. 让用户感到舒适

开发人员这样就能省去无数麻烦。

想让我再解释哪部分吗?

顺便提一句,我正在开发一个无限上下文工具,你可以用你喜欢的大语言模型而无需反复提供上下文信息。

不妨试试这个工具,它对开发者来说是完全免费的。

🛠️:功能特点

功能 功能描述
✂️ 智能片段抓取 自动从IDE、浏览器或文本中抓取代码片段并保存到仓库。
🔍 上下文搜索 使用元数据和增强的AI标签进行即时代码片段检索。
🌐 离线支持 在没有网络的情况下提供完整功能,确保隐私和安全。
🤖 AI驱动的上下文 根据上下文、编程语言和使用情况推荐相关代码片段。
IDE集成 通过插件为VS Code和JetBrains提供个性化的代码自动完成功能。


了解更多

    return re.match(evil_pattern, user_input)

## 仅仅30个字符就能让系统崩溃
malicious_input = 'a' * 30 + 'b'

Enter fullscreen mode Exit fullscreen mode

Attackers can craft inputs that make your validation function crawl to a halt.

##  A Smarter Approach 

###  Basic Validation That Actually Works 
def smart_email_check(email):
    """Quick and dirty email sanity check"""
    return (
        email and 
        '@' in email and 
        len(email) <= 254  # Email length limit
    )

Enter fullscreen mode Exit fullscreen mode

###  The Real Solution: Verification 

1. Basic syntax check

2. Send a verification link

3. Let the user prove the email works 
def validate_email(email):
    if not basic_email_check(email):
        return False

    # Send verification token
    token = generate_unique_token()
    send_verification_email(email, token)

    return True

Enter fullscreen mode Exit fullscreen mode

##  Pro Tools for Real Developers 

Instead of writing your own regex, use tested libraries:

* Python: `email-validator`

* JavaScript: `validator.js`

* Java: Apache Commons Validator

##  A Better Validation Class 
class EmailValidator:
    @staticmethod
    def validate(email):
        """
        Smart email validation
        - Quick syntax check
        - Verify deliverability
        """
        try:
            # Use a smart library
            validate_email(
                email, 
                check_deliverability=True
            )
            return True
        except EmailInvalidError:
            return False


Enter fullscreen mode Exit fullscreen mode

##  The Bottom Line 

Email validation isn't about creating an unbreakable fortress. It's about:

* Letting real users in

* Keeping your system safe

* Not making things complicated

##  Key Takeaways 

1. Forget complex regex

2. Use proven libraries

3. Send verification emails

4. Be user-friendly

Developers who get this right save themselves countless headaches.

Want me to break down any part of this further?

> Btw, I'm working on an unlimited context tool, where you can use your preferred LLM without needing to give the context again and again.   
>  Do check this out; it's completely free for developers.

###  🛠️ **Features of Pieces**

Feature | What It Does  
---|---  
✂️ **Smart Snippet Capture** | Automatically saves code snippets from IDEs, browsers, or text to a repository.  
🔍 **Contextual Search** | Allows instant retrieval of code snippets using metadata and AI-enhanced tags.  
🌐 **Offline Support** | Provides full functionality without internet, ensuring privacy and security.  
🤖 **AI-Driven Context** | Suggests relevant snippets based on context, programming language, and usage.  
⚡ **IDE Integration** | Offers personalized code autocompletion through plugins for VS Code and JetBrains.  

[  
![Read more](https://imgapi.imooc.com/675645f1093c1f7206240066.jpg)](https://pieces.app/?utm_source=dev-to&utm_medium=referral&utm_campaign=nikl-post-1)
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消