首頁 > web前端 > js教程 > 為什麼經驗豐富的開發人員從不使用正規表示式進行電子郵件驗證?

為什麼經驗豐富的開發人員從不使用正規表示式進行電子郵件驗證?

Susan Sarandon
發布: 2024-12-18 01:59:09
原創
970 人瀏覽過

無人談論的問題

說實話:電子郵件驗證聽起來很簡單,但它是一個技術陷阱,即使是經驗豐富的開發人員也會陷入困境。

到底發生了什麼事?

假設您正在建立一個註冊表單。你的第一直覺?在電子郵件欄位中新增正規表示式。糟糕的舉動。

實際上有效的奇怪電子郵件

# These are ALL technically valid emails!
valid_emails = [
    '"J. R. \"Bob\" Dobbs"@example.com',
    'admin@mailserver1',
    'user+tag@gmail.com',
    'postmaster@[123.123.123.123]'
]
登入後複製

大多數正規表示式引擎都會因這些而窒息。

為什麼?

電子郵件標準太瘋狂了。

大多數開發人員會驚訝地發現,根據 RFC 5322,這些實際上是技術上有效的電子郵件地址。規範允許:

  • 引用本地部分
  • 括號內的評論
  • 嵌套評論
  • 當地的特殊字元
  • 多個域標籤

錯誤驗證的隱性成本

1. 失去真實用戶

嚴格的正規表示式可能會拒絕完美的電子郵件地址。想像因為潛在客戶的電子郵件看起來「奇怪」而拒絕他們,就像有:

  • 加上地址(用戶tags@gmail.com)
  • 非常規的域結構
  • 國際字符集
  • 合法但複雜的命名約定

你的產品團隊會非常不高興,更重要的是;銷售真的會很生氣。

2.ReDoS攻擊

使用回溯的正規表示式引擎容易受到正規表示式阻斷服務 (ReDoS) 攻擊。

def dangerous_regex_check(user_input):
    # This regex can destroy your server's performance
    evil_pattern = r'^(a+)+b$'
    return re.match(evil_pattern, user_input)

# Just 30 characters can crash your system
malicious_input = 'a' * 30 + 'b'
登入後複製

攻擊者可以精心設計輸入,使您的驗證函數陷入停頓。

更明智的方法

實際有效的基本驗證

def smart_email_check(email):
    """Quick and dirty email sanity check"""
    return (
        email and 
        '@' in email and 
        '.' in email.split('@')[1] and
        len(email) <= 254  # Email length limit
    )
登入後複製

真正的解決方案:驗證

  1. 基本語法檢查
  2. 發送驗證連結
  3. 讓使用者證明電子郵件有效
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
登入後複製

真正開發人員的 Pro Tools

不要寫自己的正規表示式,而是使用經過測試的函式庫:

  • Python:電子郵件驗證器
  • JavaScript:validator.js
  • Java:Apache Commons 驗證器

更好的驗證類

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
登入後複製

底線

電子郵件驗證並不是要創造一個牢不可破的堡壘。這是關於:

  • 讓真實使用者進入
  • 確保您的系統安全
  • 不要讓事情變得複雜

重點

  1. 忘記複雜的正規表示式
  2. 使用經過驗證的函式庫
  3. 發送驗證郵件
  4. 使用者友善

正確做到這一點的開發人員可以避免無數的麻煩。

想要我進一步分解其中的任何部分嗎?

順便說一句,我正在開發一個無限制的上下文工具,您可以在其中使用您喜歡的法學碩士,而無需一次又一次地提供上下文。

請檢查一下,它對開發者完全免費。


Why experienced developers never use regex for email validation?

以上是為什麼經驗豐富的開發人員從不使用正規表示式進行電子郵件驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板