Есть ли эквивалент mysql_real_escape_string () для инъекций электронной почты? У меня есть форма, в которой пользователь отправляет свою электронную почту. Я боюсь, что кто-то может вставить список писем, разделенных запятыми, и использовать мой сайт для рассылки спама.
Вы можете использовать filter_var
для проверки адреса электронной почты:
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) { // invalid e-mail address }
Просто подтвердите поле против общепринятого регулярного выражения для одного адреса электронной почты
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)); }
Для тех, у кого есть более старые версии
/* # 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-]+)*(.[az]{2,3})$", $strEmail)){ // valid email } else { // not a valid email }
Если ваша основная проблема заключается в том, что, как говорится в этом вопросе, проверить, чтобы пользователи не пытались обмануть вас в рассылке для них, введя список адресов, разделенных запятыми, то не является очевидным ответом просто проверить, есть ли какие-либо запятые во вход пользователя?
Я обнаружил, что хорошая проверка электронной почты не так проста, поэтому просто решил проверить, есть ли «@» и «.». находится в строке.
function email_valid($email){ /* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "." */ if( strpos($email, "@") AND strpos($email, ".") ){ return TRUE; } else { return FALSE; } }
PS, если вы не используете подготовленные инструкции PDO для записи в базу данных, УБЕДИТЕСЬ, чтобы отфильтровать символы, которые могут вызвать SQL-инъекцию
Было бы проще проверить общую длину строки, т. Е. Локальную часть 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. Я буду использовать это в своей функции проверки.