Páginas

sábado, 21 de agosto de 2010

Validación de dominios en direcciones de correo Electrónico

Hola finalmente me he decidido a probar a crear y mantener un blog, mi primera intención es poder publicar cosas más o menos relacionadas con tecnología (Windows, SQL Server....) , pero no restringido sólo a este área por lo en alguna ocasión podréis encontrar cosas menos técnicas y más mundanas.

Pero para comenzar algo bastante técnico, un amigo me pregunta  como se podría validar si el dominio de un correo electrónico proporcionado como entrada de registro o ingreso de una aplicación es bueno o no, la aplicación en este caso esta  basada en SQL Server aunque creo que sería fácil  implementarla en otros Motores de bases de datos. Esto es algo que ya había hecho hace algunos años y que he rescatado de las cosas casi olvidadas.

Por centrar un poco mas el problema lo que buscamos es un método para que una vez que un usuario proporciona una dirección de correo electrónico en un formulario de ingreso  inmediatamente podamos validar que el dominio es un dominio de correo electrónico valido, evitando así intentos de registros con direcciones incorrectas ya sea por error o intencionadamente.

Para resolver el problema nos basamos en el comando NSLOOKUP que parametrizamos mediante modificadores en una consulta  para averiguar si existe configuración MX del dominio en cuestión, la consulta en la linea de comando seria algo así :

nslookup -q=mx  hotmail.com 

La consulta en la linea de comando y su salida en la figura 1:

Figura 1

Cuando para el dominio proporcionado como parámetro existe configuración MX (Correo Electrónico) el retorno del comando es como el de la Figura 1. Si por el contrario el dominio no existe por ejemplo  (hotmail.ocm)   o no tiene configuración MX la respuesta seria como en la figura 2.


Figura 2

Bien partiendo de estas salidas distintas en caso de domino correcto o dominio incorrecto , crearemos un procedimiento almacenado capaz de  retornar si el dominio existe o no.

Por sencillez he creado una tabla con un solo campo para insertar el resultado de ejecutar el comando NSLookup que sera posteriormente analizado por el propio procedimiento almacenado para determinar si el dominio es correcto o no,  el código para habilitar la ejecución de XP_CMDShell y crear los objetos necesarios los listo a continuación:

************* Código **************
-- Ojo Esta opción se encuentra deshabilitada por defecto por política de seguridad,

-- evaluar detenidamente las posibles vulnerabilidades  antes de habilitarla definitivamente en la instancia.

-- Para permitir ver opciones avanzadas.
EXEC sp_configure 'show advanced options', 1

GO

-- Para actualizar los valores de configuracion actuales.
RECONFIGURE

GO
-- To enable the feature.

EXEC sp_configure 'xp_cmdshell', 1

GO

--

RECONFIGURE

GO
USE tempdb -- permite crear el procedimiento en entorno volátil antes de implementar

GO
create table output_tmp

(texto varchar(256))

GO
create proc Usp_valida_domain

@domain varchar(50) --ojo algun dominio podría exceder este tamaño y no ser validado por truncado

as

SET NOCOUNT ON
declare @comand varchar(256)
truncate table output_tmp

set @comand='Nslookup -q=mx '+@domain

DECLARE @SQLString NVARCHAR(4000)

Set @SQLString='exec master.dbo.xp_cmdshell '+char(39)+@comand+char(39)

--insert output_tmp

exec sp_executesql @SQLString
select @SQLString
if ( select distinct top 1 patindex('%mail exchanger%',texto) -- con que exista una sola entrada es suficiente
from output_tmp
where patindex('%mail exchanger%',texto)<>0

group by patindex('%mail exchanger%',texto)) <> 0 -- El texto mail exchanger determina la existencia de configuracion MX

begin

print 'Dominio valido' -- las salidas se pueden modificar para que sean 0/1 según sea necesario su uso

end

else

print 'Dominio no valido'

go
exec Usp_valida_domain 'yahoo.es' -- test con dominio correcto
exec Usp_valida_domain 'yahoo.e' -- test con dominio incorrecto

*************** CODIGO *****************

 Comentar por ultimo que se puede especificar un tiempo de TimeOut par la consulta mx ya que es posible que el servidor DNS que realiza la consulta funcione con algo de retraso y no valide dominio en tiempo, de esta forma si pasamos el tiempo de TimeOut como parámetro con -TimeOut=10 el servidor DNS que realiza la consulta se tomara 10 segundos para contestarnos que el dominio hotmail.ocm no es valido.


Figura 3


Espero que encontréis esta entrada de utilidad.

LinkedIn