2009-12-29 14 views
12

Escenario:
Tengo un formulario de contacto en mi aplicación web, recibe una gran cantidad de correo no deseado.
Estoy validando el formato de las direcciones de correo electrónico, es decir, ^[email protected]+\..+$
Estoy usando un servicio de filtrado de correo no deseado (defensio) pero los puntajes de spam devueltos se superponen con los mensajes válidos. En un umbral de 0.4, algunos mensajes no deseados se transmiten y algunas preguntas de los clientes se arrojan erróneamente en un registro y se muestra un error.Uso de registros MX para validar direcciones de correo electrónico

Todos los mensajes no deseados utilizan direcciones de correo electrónico falsas, p. [email protected]

Servidor PHP5 Linux dedicado en EE. UU., mysql, registrando correo no deseado solamente, enviando por correo electrónico los mensajes no spam (no almacenados).

Propuesta: de checkdnsrr(preg_replace(/^[email protected]/, '', $_POST['email']), 'MX') usar PHP para comprobar el dominio de correo electrónico se resuelve en una dirección válida, registro en un archivo, a continuación, redirigir con un error para los mensajes que no se resuelven, continúe con el servicio de filtro de correo no deseado como antes para las direcciones que se resuelven de acuerdo con checkdnsrr().

He leído (y soy escéptico al respecto) que nunca se debe dejar este tipo de validación en búsquedas remotas, pero ¿por qué?

Aparte de los problemas de conectividad, donde de todos modos tendré problemas más grandes que un formulario de contacto, ¿va a encontrar checkdnsrr falsos positivos/negativos?
¿Habría algunos tipos de direcciones que no se resolverían? direcciones gubernamentales? direcciones de correo electrónico ip?
¿Necesito escapar del nombre de host que paso a checkdnsrr()?

Solución: Una combinación de las tres respuestas (desearía poder aceptar más de una como respuesta compuesta).

estoy usando:

$email_domain = preg_replace('/^[email protected]/', '', $email).'.'; 
if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){ 
    //validation error 
} 

todo el spam se está registrando y se gira. Con vistas a actualizar a una cola de trabajos en una fecha posterior.

Se hicieron algunos comentarios acerca de preguntar al servidor de correo para que el usuario los verifique, sentí que esto sería demasiado tráfico y podría bloquear mi servidor o meterlo en problemas de alguna manera, y esto es solo para cortar la mayor parte del correos electrónicos que se recuperaban debido a direcciones de servidor no válidas.

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

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. 

Muchas gracias a todos (especialmente ZoogieZork por la punta Un repliegue registro)

+0

+1 .. nunca he oído hablar de comprobación de un correo electrónico válida comprobando los registros MX .. eso es una buena idea que pienso. – Earlz

+3

Tenga en cuenta que debe verificar el registro A si no aparece un registro MX, como se define en RFC 5321. Es raro, pero algunos dominios no tienen un registro MX (por varias razones). Más información: http://en.wikipedia.org/wiki/MX_record#History_of_fallback_to_A – ZoogieZork

+0

Cheers Zork, exactamente el tipo de problemas que me preocupaban. –

Respuesta

4

veo ningún daño hacer una búsqueda de MX con checkdnsrr() y yo también no veo cómo falsos positivos pueden aparecer. No necesita escapar del nombre de host, de hecho, puede utilizar esta técnica y llevarlo un poco más lejos al hablar con el MTA y probar si el usuario existe en un host dado (sin embargo, esta técnica puede y probablemente le dará algún tipo de false positivos en algunos hosts).

+6

La mayoría de los hosts SMTP que puede encontrar en la naturaleza no responderán bien a los comandos VRFY (tanto los que siempre están bien como ERROR siempre son respuestas que puede esperar). Se desaconseja usar VRFY para validar direcciones. – Guss

5

Las búsquedas de DNS pueden ser lentas a veces, dependiendo del tráfico de la red & congestión, por lo que es algo a tener en cuenta.

Si estuviera en su lugar, lo probaría y vería cómo funciona. Durante aproximadamente una semana, registre todos los correos electrónicos en una base de datos o archivo de registro e incluya un campo para indicar si se marcará como correo no deseado o legítimo. Después de que termine la semana, eche un vistazo a los resultados y vea si funcionan como usted esperaría.

Al tomar este enfoque de registro/prueba, tiene la flexibilidad para probarlo y no preocuparse por perder los correos electrónicos de los clientes.

Tengo el hábito de agregar un campo adicional a mis formularios que está oculto con CSS, si está completo, supongo que será enviado por un bot de spam. También me aseguro de usar un nombre como "url" o "website_url" algo que parece un nombre de campo legítimo para un bot de spam. Agregue una etiqueta para el campo que diga algo así como "No complete este campo", de modo que si el navegador de alguien no lo muestra correctamente, sabrá que no debe completar el campo de correo no deseado. Hasta ahora está funcionando muy bien para mí.

+1

Re: campo oculto - ¡Buena idea! En cuanto al registro, asegúrese de registrar también el tiempo que le llevó resolver el registro DNS. Puede descubrir que lleva mucho tiempo y que la experiencia del usuario es deficiente. – Guss

+0

Estoy probando el campo oculto ahora, parece funcionar bien, aunque algunos ... los usuarios están escribiendo "No estoy seguro de qué poner en este campo" –

+0

Si los usuarios están escribiendo algo en el campo, no se está ocultando correctamente. Puede haber un error en su CSS que no esté ocultando el campo correctamente. por lo general hago algo como esto: No he visto ningún tipo de spam que viene a las formas en que he implementado esto por bastante tiempo. – bradym

0

Una búsqueda MX es solo una parte de la imagen; si desea asegurarse de que la dirección de correo electrónico sea válida en sí misma, debe intentar enviar un correo electrónico a esa cuenta.

El otro posible escenario es que alguien simplemente puede usar cuentas de correo secuestradas de una máquina comprometida. Por supuesto, es probable que sea menos probable que ocurra, pero todavía lo hace.

Existen bibliotecas de validación de direcciones de correo electrónico que hacen esto, simplemente busque la validación de correo electrónico.

Todo esto se puede hacer de forma asincrónica. Tengo esta configuración en mi sitio, en cuyo caso el correo electrónico se guarda en la base de datos (para propósitos de auditoría), un trabajo en cola, luego cuando el trabajo llega el momento de ejecutar, cualquier validación adicional se realiza en ese momento. Descarga el trabajo pesado a otro hilo.

Para el usuario, parece que el correo electrónico ya se envió, estaba (está en la base de datos) y se puede ver internamente, pero el correo electrónico real no se enviará por correo hasta que se ejecute la tarea que puede ser inmediatamente o una cantidad determinada de tiempo dependiendo de la carga del servidor.

Walter

+0

Me gusta la idea de una cola de trabajos de validación –

+0

Es una cola de trabajos, parte de ese trabajo es hacer la validación. El problema con este modelo es que alguien puede ingresar un correo electrónico pensando que es válido y enviado, y luego cuando se procesa más tarde, el sistema lo rechazará. –

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.'); 
} 
Cuestiones relacionadas