Foros del Web » Programando para Internet » PHP »

[APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

Estas en el tema de [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales en el foro de PHP en Foros del Web. He desarrollado una utilidad para evitar los registros fraudulentos, resulta que en la página de mi jefe (una empresa que para nada envía spam) hemos ...
  #1 (permalink)  
Antiguo 21/03/2012, 12:31
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
De acuerdo [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

He desarrollado una utilidad para evitar los registros fraudulentos, resulta que en la página de mi jefe (una empresa que para nada envía spam) hemos tenido unos registros fraudulentos y después de mucho buscar en Internet veo que éste tema está verde, así que me he decidido a hacerlo yo mismo.

Voy a añadir más funciones como obtener el listado en un array para otros usos, la idea es tener una blacklist actualizada. Iré completando el post y la página. Espero opiniones. saludos.

Código:
function bmCheck ( $m ) {
$cUrl = 'http://blackmail.api.l3o.org/'; $q = http_build_query ( array ( 'm' => $m ) );
return file_get_contents ( $cUrl , false , stream_context_create ( array ( 'http' => array ( 'method' => 'POST' , 'header' => "Connection: close\r\nContent-Length: " . strlen ( $q ) . "\r\n" , 'content' => $q ) ) ) );
}
La función trabaja con un correo completo (ej. [email protected]) o también se le puede pasar sólo el dominio (ej. yopmail.com), la función devolvera '1' si el dominio no existe en la lista o '0' si existe.

Página:
http://blackmail.api.l3o.org/

Página de prueba:
http://dev.l3o.org/bm/

Código de la página de prueba:
index.php
Código:
<?php

	function bmCheck ( $m ) {
		$cUrl = 'http://blackmail.api.l3o.org/'; $q = http_build_query ( array ( 'm' => $m ) );
		return file_get_contents ( $cUrl , false , stream_context_create ( array ( 'http' => array ( 'method' => 'POST' , 'header' => "Connection: close\r\nContent-Length: " . strlen ( $q ) . "\r\n" , 'content' => $q ) ) ) );
    }

	if ( $_POST['mail'] ) {
		$r = (bmCheck ( $_POST['mail'] )) ? 'Correo válido' : 'Correo inválido' ;
		echo $r;
    }

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>BlackMail TEST</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="index.php">
  <input type="text" name="mail" id="mail" /><br />
  <input type="submit" name="button" id="button" value="Enviar" />
</form>
</body>
</html>

Última edición por lambar; 21/03/2012 a las 12:45
  #2 (permalink)  
Antiguo 22/03/2012, 03:47
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

Está funcionando perfectamente en un oscommerce, no ralentiza el registro ni nada, si queréis la dirección preguntar por mp.

Voy a usar este post como historial de cambios si al staff no le parece mal.

De primeras voy a añadir un segundo parámetro opcional por si se desea la respuesta en un error de texto o por defecto.

También voy a hacer otra función para obtener el listado completo por si quereis haceros un caché y no estar enviando peticiones post
  #3 (permalink)  
Antiguo 22/03/2012, 06:27
Avatar de iviamontes  
Fecha de Ingreso: enero-2011
Ubicación: $cubano->Arg->Mendoza
Mensajes: 1.184
Antigüedad: 13 años, 10 meses
Puntos: 209
Respuesta: [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

yo para ver si un dominio existe, hago esto
Código PHP:
<?php
function validar_email($email){
 
$exp "^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
 if(
eregi($exp,$email)){
  if(
checkdnsrr(array_pop(explode("@",$email)),"MX")){
  return 
true;
}else{
return 
false;
}

}else{

return 
false;

}
}

// para aplicarla

if (validar_email($_GET[correo])){
// coloco las instrucciones
echo 'Es correcto el correo';
}else{
echo 
'Es falso el correo';
}

?>
__________________
aconcaguaestudio.com
  #4 (permalink)  
Antiguo 22/03/2012, 06:53
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

Hola Iviamontes, yo también tengo algo parecido pero el problema no es saber si el dominio existe, es más, si algún dominio de la lista no existe tengo que borrarlo por que es una comprobación inútil, la idea de esto es evitar que se registren con los buzones falsos que ofrecen estos dominios, buzones de usar y tirar pensados para páginas que envían mucho Spam, y no hay manera física de saber si el dominio del buzón que nos introducen se dedica a este tema, por lo tanto hay que hacer una pequeña base de datos como ésta, en un principio, y lógicamente, pensé en hacerme la mía y punto, pero tendré que estar actualizándola de vez en cuando mientras que el resto de Webmasters tendrán que hacer lo mismo, así que como tengo muchas páginas y voy a introducir la función en todas pues en mi servidor general me he hecho esto para mí y ya que está hecho lo pongo a vuestra disposición que no me cuesta nada.


=) Saludos


Edito:
Iviamontes ahora deberías hacer esto: :)

Código PHP:
<?php

function bmCheck $m ) {
  
$cUrl 'http://blackmail.api.l3o.org/'$q http_build_query ( array ( 'm' => $m ) );
  return 
file_get_contents $cUrl false stream_context_create ( array ( 'http' => array ( 'method' => 'POST' 'header' => "Connection: close\r\nContent-Length: " strlen $q ) . "\r\n" 'content' => $q ) ) ) );
}

function 
validar_email($email) {
  
$exp "^[a-z'0-9]+([._-][a-z'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
  if(
eregi($exp,$email)){
    if(
checkdnsrr(array_pop(explode("@",$email)),"MX")){
      if ( 
bmCheck $email ) ) {
        return 
true;
      }else{
        return 
false;
      }
    }else{
      return 
false;
    }
  }else{
    return 
false;
  }
}

// para aplicarla

if (validar_email($_GET[correo])){
// coloco las instrucciones
echo 'Es correcto el correo';
}else{
echo 
'Es falso el correo';
}

?>
  #5 (permalink)  
Antiguo 22/03/2012, 07:30
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Y usar un servicio de dnsbl?
  #6 (permalink)  
Antiguo 22/03/2012, 07:50
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

voy a enterarme ahora mismo que es eso.... xD gracias

edito:
Si me he enterado bien eso es un servicio de listas negras para el correo entrante en el servicio de correo (postfix, en mi caso) o antispam, no es así?

pero tampoco es lo que yo necesito aquí, lo que yo hago es bloquear el registro en mi web si me das un correo temporal, yo necesito que los registros en mi web sean con el correo principal puesto que son empresas que no envían spam, para que no me entren correos de estos buzones (que no es lo que me preocupa) ya están los filtros antispam.

saludos

Última edición por lambar; 22/03/2012 a las 07:56
  #7 (permalink)  
Antiguo 22/03/2012, 11:13
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

Dos funciones más

Código PHP:
    function bmArray ( ) {
        
$cUrl 'http://blackmail.api.l3o.org/?list&array'; return explode ';' file_get_contents $cUrl ) );
    }

    function 
bmJson ( ) {
        
$cUrl 'http://blackmail.api.l3o.org/?list&json'; return json_decodefile_get_contents $cUrl ) , true);
    } 

Podéis ver los resultados de todo aquí:
http://dev.l3o.org/bm/
y el código fuente aquí:
http://dev.l3o.org/bm/index.phps

más info en:
http://blackmail.api.l3o.org/
  #8 (permalink)  
Antiguo 20/06/2012, 11:01
Avatar de lambar  
Fecha de Ingreso: marzo-2005
Ubicación: Murcia Fumeta
Mensajes: 55
Antigüedad: 19 años, 8 meses
Puntos: 0
Respuesta: [APORTE] BlackMail - Evitar registros fraudulentos con correos temporales

Voy a añadir soporte para que compruebe si el correo existe mediante sockets después de poner a prueba una función que me he encontrado que parece que funcionar estupendamente:

Código:
function validateEmail($email, $domainCheck = true, $verify = true, $return_errors=false) {
    global $debug;
    if($debug) {echo "<pre>";}
    $errors = array();
    # Check syntax with regex
    if (preg_match('/^([a-zA-Z0-9\._\+-]+)\@((\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,7}|[0-9]{1,3})(\]?))$/', $email, $matches)) {
        $user = $matches[1];
        $domain = $matches[2];
        # Check availability of DNS MX records
        if ($domainCheck && function_exists('checkdnsrr')) {
            # Construct array of available mailservers
            if(getmxrr($domain, $mxhosts, $mxweight)) {
                for($i=0;$i<count($mxhosts);$i++){
                    $mxs[$mxhosts[$i]] = $mxweight[$i];
                }
                asort($mxs);
                $mailers = array_keys($mxs);
            } elseif(checkdnsrr($domain, 'A')) {
                $mailers[0] = gethostbyname($domain);
            } else {
                $mailers=array();
            }
            $total = count($mailers);
            # Query each mailserver
            if($total> 0 && $verify) {
                # Check if mailers accept mail
                for($n=0; $n <$total; $n++) {
                    # Check if socket can be opened
                    if($debug) { echo "Checking server $mailers[$n]...\n";}
                    $connect_timeout = 2;
                    $errno = 0;
                    $errstr = 0;
                    $probe_address = '[email protected]';
                    # Try to open up socket
                    if($sock = @fsockopen($mailers[$n], 25, $errno , $errstr, $connect_timeout)) {
                        $response = fgets($sock);
                        if($debug) {echo "Opening up socket to $mailers[$n]... Succes!\n";}
                        stream_set_timeout($sock, 5);
                        $meta = stream_get_meta_data($sock);
                        if($debug) { echo "$mailers[$n] replied: $response\n";}
                        $cmds = array(
                            "HELO karonline.es",  # Be sure to set this correctly!
                            "MAIL FROM: <$probe_address>",
                            "RCPT TO: <$email>",
                            "QUIT",
                        );
                        # Hard error on connect -> break out
                        if(!$meta['timed_out'] && !preg_match('/^2\d\d[ -]/', $response)) {
                            $error = "Error: $mailers[$n] said: $response\n";
                            break;
                        }
                        foreach($cmds as $cmd) {
                            $before = microtime(true);
                            fputs($sock, "$cmd\r\n");
                            $response = fgets($sock, 4096);
                            $t = 1000*(microtime(true)-$before);
                            if($debug) {echo htmlentities("$cmd\n$response") . "(" . sprintf('%.2f', $t) . " ms)\n";}
                            if(!$meta['timed_out'] && preg_match('/^5\d\d[ -]/', $response)) {
                                $error = "Unverified address: $mailers[$n] said: $response";
                                break 2;
                            }
                        }
                        fclose($sock);
                        if($debug) { echo "Succesful communication with $mailers[$n], no hard errors, assuming OK";}
                        break;
                    } elseif($n == $total-1) {
                        $errors = "None of the mailservers listed for $domain could be contacted";
                    }
                }
            } else {
                $error = "No usable DNS records found for domain '$domain'";
            }
        }
    } else {
        $error = 'Address syntax not correct';
    }
    if($debug) { echo "</pre>";}
    #echo "</pre>";
    if($return_errors) {
        # Give back details about the error(s).
        # Return FALSE if there are no errors.
        # Keep this in mind when using it like:
        # if(checkEmail($addr)) {
        # Because of this strange behaviour this
        # is not default 
        if(isset($error)) return htmlentities($error); else return false;
    } else {
        # 'Old' behaviour, simple to understand
        if(isset($error)) return false; else return true;
    }
}
Espero opiniones.

Última edición por lambar; 21/06/2012 a las 11:31

Etiquetas: blacklist, correo, temporal
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:31.