2009-12-29 3 views
12

Сценарий:
У меня есть контактная форма на моем веб-приложении, она получает много спама.
Я проверяю формат адресов электронной почты loosely i.e. ^[email protected]+\..+$
Я использую службу фильтрации спама (defensio), но полученные спам-ответы перекрываются с действительными сообщениями. На пороге 0,4 происходит спам, и некоторые вопросы клиента ошибочно попадают в журнал и отображается ошибка.Использование записей MX для проверки адресов электронной почты

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

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

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

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

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

Комбинация всех трех ответов (желательно, чтобы я мог принять более одного в качестве составного ответа).

Я использую:

$email_domain = preg_replace('/^[email protected]/', '', $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 для наконечника Рекордное запасного варианта)

+0

+1 .. Я никогда не слышал о проверке действительного электронной почты, проверяя записи MX .. вот хорошая идея, я думаю. – Earlz

+3

Имейте в виду, чтобы проверить запись A, если запись MX не указана, как определено в RFC 5321. Это редко, но некоторые домены не имеют записи MX (по разным причинам). Дополнительная информация: http://en.wikipedia.org/wiki/MX_record#History_of_fallback_to_A – ZoogieZork

+0

Приветствия Зорка, именно такого рода ошибок, о которых я беспокоился. –

ответ

4

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

+6

Большинство хостов SMTP, которые вы можете найти в дикой природе, не будут хорошо реагировать на команды VRFY (оба всегда ОК, а также всегда ERROR - ответы, которые вы можете ожидать). Использование VRFY для проверки адресов сильно обескуражено. – Guss

5

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

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

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

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

+1

Re: скрытое поле - хорошая идея! Что касается ведения журнала - убедитесь, что вы также зарегистрировали время, необходимое для разрешения записи DNS. Вы можете узнать, что это занимает слишком много времени и приводит к плохой работе с пользователями. – Guss

+0

Я сейчас тестирую скрытое поле, похоже, работает нормально, хотя некоторые ... пользователи печатают «Не уверен, что положить в это поле» –

+0

Если пользователи печатают что-либо в этом поле, оно не скрывается должным образом. В вашем CSS может быть ошибка, которая не скрывает поле должным образом. я обычно делаю что-то вроде этого: <метка для = "URL"> Игнорируйте это текстовое поле. Он используется для того, чтобы находить людей, засоряющих чат. Если вы введете что-либо в это текстовое поле, ваше сообщение не будет отправлено. <входной тип = «текст» ID = «URL» имя = «URL» размер = «1» значение = «» /> Я не видел никакого спама, к формам, где я реализовали это довольно долгое время. – bradym

0

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

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

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

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

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

Walter

+0

Мне нравится идея очереди проверки валидации –

+0

Это очередь заданий, часть этой работы - проверка. Проблема с этой моделью заключается в том, что кто-то может ввести сообщение электронной почты, считая его действительным и отправленным, а затем, когда он будет обработан позже, система отклонит его. – 2010-06-09 13:58:33

0
function mxrecordValidate($email){ 
     list($user, $domain) = explode('@', $email); 
     $arr= dns_get_record($domain,DNS_MX); 
     if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){ 
       return $arr[0]['target']; 
     } 
} 
$email= '[email protected]'; 

if(mxrecordValidate($email)) { 
     echo('This MX records exists; I will accept this email as valid.'); 
} 
else { 
     echo('No MX record exists; Invalid email.'); 
}