說實話:電子郵件驗證聽起來很簡單,但它是一個技術陷阱,即使是經驗豐富的開發人員也會陷入困境。
假設您正在建立一個註冊表單。你的第一直覺?在電子郵件欄位中新增正規表示式。糟糕的舉動。
# 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,這些實際上是技術上有效的電子郵件地址。規範允許:
嚴格的正規表示式可能會拒絕完美的電子郵件地址。想像因為潛在客戶的電子郵件看起來「奇怪」而拒絕他們,就像有:
你的產品團隊會非常不高興,更重要的是;銷售真的會很生氣。
使用回溯的正規表示式引擎容易受到正規表示式阻斷服務 (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 )
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
不要寫自己的正規表示式,而是使用經過測試的函式庫:
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
電子郵件驗證並不是要創造一個牢不可破的堡壘。這是關於:
正確做到這一點的開發人員可以避免無數的麻煩。
想要我進一步分解其中的任何部分嗎?
順便說一句,我正在開發一個無限制的上下文工具,您可以在其中使用您喜歡的法學碩士,而無需一次又一次地提供上下文。
請檢查一下,它對開發者完全免費。
以上是為什麼經驗豐富的開發人員從不使用正規表示式進行電子郵件驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!