2010-01-27 28 views
10

Có tương đương với mysql_real_escape_string() để tiêm email không? Tôi có một hình thức mà người dùng gửi email của họ. Tôi sợ rằng ai đó có thể chèn danh sách email được phân cách bằng dấu phẩy và sử dụng trang web của tôi để gửi spam.Chức năng xác thực email PHP

+0

Đẩy nó qua this regex. –

Trả lời

31

Bạn có thể sử dụng filter_var để xác nhận địa chỉ email:

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

Điều đó có đảm bảo rằng chỉ có một địa chỉ email không? – Brian

+0

@Brian: Có, nó sẽ trả về * false * nếu bạn kiểm tra chuỗi như 'user-a @ example.com, user-b @ example.com'. – Gumbo

+4

+1 để sử dụng chức năng gốc – Gordon

2

Đơn giản chỉ cần xác nhận lĩnh vực này đối với một biểu thức chính quy thường được tìm thấy cho địa chỉ email duy nhất

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

Nếu mối quan tâm chính của bạn là, như câu hỏi nêu rõ, để xác minh rằng người dùng đã không lừa bạn gửi spam cho họ bằng cách nhập danh sách địa chỉ được phân tách bằng dấu phẩy, thì không phải là câu trả lời rõ ràng để kiểm tra xem có bất kỳ dấu phẩy nào trong đầu vào của người dùng không?

1

Đối với những người có các phiên bản cũ

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

eregi ist khấu hao từ PHP 5.3 – Gerfried

+0

Cảm ơn nhận xét. Dully lưu ý. – TheBlackBenzKid

0

tôi thấy rằng tốt xác nhận email mà không phải là đơn giản, vì vậy chỉ cần quyết định để kiểm tra xem "@" và "" nằm trong chuỗi.

function email_valid($email){ 
    /* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "." */ 

    if(strpos($email, "@") AND strpos($email, ".")){ 
     return TRUE; 
    } 
    else { 
     return FALSE; 
    } 
} 

P.S. nếu bạn không sử dụng các câu lệnh chuẩn bị PDO để ghi vào cơ sở dữ liệu, BE SURE để lọc ra các biểu tượng có thể gây ra tiêm sql

+0

Bạn ít nhất có thể chắc chắn rằng '.' vị trí lớn hơn '@'. Tuy nhiên tôi nghĩ rằng nó có thể tạo ra một xác nhận tốt hơn với biểu thức regex. – patricia

+0

Thực ra, email thậm chí có thể không chứa ".", Ví dụ:"user @ hostname" trong mạng nội bộ nên hoàn toàn có thể sử dụng được – Victor

+0

@Victor đó là sự thật. Sau một vài năm lập trình kể từ khi tôi trả lời câu hỏi, tôi đã đi đến kết luận rằng nó không đáng để xác thực địa chỉ email hơn ''. Những gì bạn quan tâm là nếu người dùng có thể nhận được email từ bạn, điều này có thể không thực hiện được ngay cả với địa chỉ email hợp lệ, vì vậy việc gửi email xác nhận đơn giản hơn rất nhiều thay vì viết mã xác nhận. – Tomas

0

Nó sẽ đơn giản hơn để kiểm tra tổng chiều dài chuỗi - tức là phần địa phương tối đa 64 + miền @ + phần tối đa 255 ký tự = 320 ký tự, nhưng sau đó gửi đi các địa chỉ ngắn sẽ vẫn có thể thực hiện được. Tôi hiện đang nghiên cứu xác nhận email cho dự án của mình và tìm thấy bài viết thú vị này email validation giải thích các địa chỉ email hợp lệ và rfc2822. Ở đó, họ đề xuất một cách đơn giản hơn nhiều để xác thực rằng sẽ ngăn chặn các danh sách được phân cách bằng dấu phẩy là một hình thức spam hiệu quả.

$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 
} 

Việc này chỉ đơn giản là ngắt địa chỉ email bằng cách tìm ký hiệu @ cuối cùng và khai báo tất cả mọi thứ trước khi nó là phần địa phương có giới hạn 64 ký tự. Nếu không có ký hiệu @ thì strrpos sẽ trả về giá trị bolean sai. Tôi sẽ sử dụng điều này trong hàm xác nhận của mình.

Các vấn đề liên quan