Использование записей MX для проверки адресов электронной почты

Сценарий:
У меня есть контактная форма в моем веб-приложении, она получает много спама.
Я неточно проверяю формат адресов электронной почты, т.е. ^.+@.+\..+$
Я использую спам службы фильтрации (defensio), но возвращаемые оценки спама перекрываются с допустимыми сообщениями. При пороге 0,4 часть спама проходит, некоторые вопросы клиентов ошибочно заносятся в журнал и отображается ошибка.

Все спам-сообщения используют поддельные адреса электронной почты, например. [email protected]

Выделенный сервер PHP5 Linux в США, mysql, регистрирует только спам, отправляет по электронной почте сообщения, не являющиеся спамом (не сохраняются).

Предложение: Используйте checkdnsrr(preg_replace(/^.+?@/, '', $_POST['email']), 'MX') в php, чтобы проверить, что домен электронной почты разрешается в действительный адрес, записывать в файл, затем перенаправлять с ошибкой для сообщений, которые не разрешаются, переходить к службе фильтрации спама, как и раньше, для адресов. которые разрешаются в соответствии с checkdnsrr().

Я читал (и сам отношусь к этому скептически), что вы никогда не должны оставлять этот тип проверки на удаленный поиск, но почему?

Помимо проблем с подключением, где у меня в любом случае будут проблемы посерьезнее, чем с контактной формой, будет ли checkdnsrr сталкиваться с ложными срабатываниями/отрицательными значениями?
Будут ли какие-то типы адресов, которые не разрешатся? гос адреса? IP-адреса электронной почты?
Нужно ли экранировать имя хоста, которое я передаю в checkdnsrr()?

Решение. Сочетание всех трех ответов (хотел бы я принять более одного ответа в качестве составного).

Я использую:

$email_domain = preg_replace('/^.+?@/', '', $email).'.';
if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){
   //validation error
}

Весь спам регистрируется и ротируется. С целью обновления до очереди заданий на более поздний срок.

Были сделаны некоторые комментарии о том, чтобы запросить у почтового сервера подтверждение пользователя, я чувствовал, что это будет слишком много трафика и может каким-то образом заблокировать мой сервер или вызвать проблемы, и это только для того, чтобы вырезать большую часть писем, которые были отправлены. возвращено из-за недопустимых адресов серверов.

http://en.wikipedia.org/wiki/Fqdn и

RFC2821
The lookup first attempts to locate an MX record associated with the name.
If a CNAME record is found instead, the resulting name is processed as if 
it were the initial name.
If no MX records are found, but an A RR is found, the A RR is treated as
if it was associated with an implicit MX RR, with a preference of 0,
pointing to that host.  If one or more MX RRs are found for a given
name, SMTP systems MUST NOT utilize any A RRs associated with that
name unless they are located using the MX RRs; the "implicit MX" rule
above applies only if there are no MX records present.  If MX records
are present, but none of them are usable, this situation MUST be
reported as an error.

Большое спасибо всем (особенно ZoogieZork за запасной совет по записи A)


person Question Mark    schedule 29.12.2009    source источник
comment
+1 .. Я никогда не слышал о проверке действительного адреса электронной почты путем проверки записей MX .. Я думаю, это хорошая идея.   -  person Earlz    schedule 29.12.2009
comment
Не забудьте проверить запись A, если запись MX не указана в списке, как определено в RFC 5321. Это редко, но некоторые домены не имеют записи MX (по разным причинам). Дополнительная информация: en.wikipedia.org/wiki/MX_record#History_of_fallback_to_A   -  person ZoogieZork    schedule 30.12.2009
comment
Ура, Зорк, именно о таких проблемах я и беспокоился.   -  person Question Mark    schedule 30.12.2009


Ответы (3)


Я не вижу никакого вреда в поиске MX с помощью checkdnsrr(), и я также не вижу, как могут появиться ложные срабатывания. Вам не нужно экранировать имя хоста, на самом деле вы можете использовать эту технику и пойти немного дальше, поговорив с MTA и проверив, существует ли пользователь на данном хосте (однако этот метод может и, вероятно, даст вам некоторые ложные положительные моменты у некоторых хостов).

person Alix Axel    schedule 29.12.2009
comment
Большинство хостов SMTP, которые вы можете найти в дикой природе, не будут хорошо реагировать на команды VRFY (как всегда OK, так и всегда ERROR — это ответы, которые вы можете ожидать). Использование VRFY для проверки адресов крайне не рекомендуется. - person Guss; 30.12.2009

Поиск DNS иногда может быть медленным, в зависимости от сетевого трафика и перегрузки, так что об этом нужно знать.

Если бы я был на вашем месте, я бы проверил это и посмотрел, как оно работает. В течение недели или около того записывайте все электронные письма в базу данных или в файл журнала и добавляйте поле, чтобы указать, будут ли они помечены как спам или легитимная электронная почта. По окончании недели взгляните на результаты и посмотрите, работают ли они так, как вы ожидаете.

Использование этого подхода к регистрации/тестированию дает вам возможность протестировать его и не беспокоиться о потере электронных писем клиентов.

У меня есть привычка добавлять дополнительное поле в свои формы, которое скрыто с помощью CSS, если оно заполнено, я предполагаю, что оно отправлено спам-ботом. Я также обязательно использую имя, такое как «url» или «website_url», которое выглядит как законное имя поля для спам-бота. Добавьте метку для поля, которая говорит что-то вроде «Не заполняйте это поле», чтобы, если чей-то браузер не отобразил его правильно, они знали, что не следует заполнять поле для спама. Пока это работает очень хорошо для меня.

person bradym    schedule 29.12.2009
comment
Re: скрытое поле - хорошая идея! Что касается ведения журнала — убедитесь, что вы также регистрируете время, затраченное на разрешение записи DNS. Вы можете обнаружить, что это занимает слишком много времени и приводит к плохому взаимодействию с пользователем. - person Guss; 30.12.2009
comment
Сейчас я тестирую скрытое поле, вроде работает нормально, хотя некоторые... пользователи печатают Не знаю, что вставить в это поле - person Question Mark; 22.07.2010
comment
Если пользователи что-то вводят в поле, это не скрывается должным образом. В вашем CSS может быть ошибка, которая не скрывает поле должным образом. Обычно я делаю что-то вроде этого: ‹span style=display:none;visibility:hidden;› ‹label for=url› Игнорировать это текстовое поле. Он используется для того, чтобы находить людей, засоряющих чат. Если вы что-нибудь введете в это текстовое поле, ваше сообщение не будет отправлено. ‹/label› ‹input type=text id=url name=url size=1 value= /› ‹/span› Я не видел спама, приходящего в формы, где я это реализовал, уже довольно давно. - person bradym; 24.07.2010

Поиск MX — это только часть картины, если вы хотите убедиться, что адрес электронной почты сам по себе действителен, вам нужно попытаться отправить электронное письмо на эту учетную запись.

Другой возможный сценарий: кто-то может просто использовать украденные учетные записи электронной почты со взломанной машины. Конечно, это, вероятно, немного реже, но все же происходит.

Существуют библиотеки проверки адресов электронной почты, которые делают это, просто найдите проверку электронной почты.

Все это можно сделать асинхронно. У меня есть эта настройка на моем сайте, и в этом случае электронная почта сохраняется в базе данных (для целей аудита), задание ставится в очередь, а затем, когда приходит время выполнения задания, в этот момент выполняется любая дополнительная проверка. Он перекладывает тяжелую работу на другой поток.

Пользователю кажется, что электронное письмо уже было отправлено, оно было (оно находится в базе данных) и может быть просмотрено внутренне, но фактическое электронное письмо не будет отправлено по почте до тех пор, пока это задание не будет выполнено, что может быть немедленно или задано. количество времени в зависимости от загрузки сервера.

Уолтер

person Community    schedule 29.12.2009
comment
Мне нравится идея очереди заданий проверки - person Question Mark; 08.06.2010
comment
Это очередь заданий, частью которой является проверка. Проблема с этой моделью заключается в том, что кто-то может ввести электронное письмо, думая, что оно действительно и отправлено, а затем, когда оно будет обработано, система отклонит его. - person ; 09.06.2010