2010-01-27 89 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。我將在我的驗證功能中使用這個。