Функция проверки электронной почты PHP

Есть ли эквивалент mysql_real_escape_string() для инъекций электронной почты? У меня есть форма, в которой пользователь отправляет свою электронную почту. Я боюсь, что кто-то может вставить список писем, разделенных запятыми, и использовать мой сайт для рассылки спама.

Ответ 1

Вы можете использовать filter_var для подтверждения адреса электронной почты:

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

Ответ 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));
}

Ответ 3

Для более старых версий

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

Ответ 4

Если ваша основная проблема заключается в том, что, как говорится в этом вопросе, убедитесь, что пользователи не пытались обмануть вас в рассылке для них, введя список адресов, разделенных запятыми, тогда не является очевидным ответом, чтобы просто проверить, есть ли являются ли какие-либо запятые в пользовательском вводе?

Ответ 5

Я обнаружил, что хорошая проверка электронной почты не так проста, поэтому просто решил проверить, есть ли "@" и ".". находится в строке.

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-инъекцию

Ответ 6

Было бы проще проверить общую длину строки - то есть локальную часть max 64 + раздел домена @+ максимум 255 символов = 320 символов, но тогда короткие спам-сообщения будут по-прежнему возможны. В настоящее время я изучаю проверку подлинности электронной почты для своего проекта и нашел эту интересную статью проверку подлинности электронной почты, которая объясняет глубинные действительные адреса электронной почты и 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. Я буду использовать это в своей функции проверки.