• Publicidad

Consulta expresión regular en Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Consulta expresión regular en Perl

Notapor isantander » 2019-01-23 14:09 @631

Cordiales saludos a todos.

Tuve que incursionar en las expresiones regulares y como si fuera poco, en Perl.

El problema fue una regla nueva a incluir en Spamassassin. La solución que tenía que implementar era bloquear el acceso de correos que falseaban la dirección de modo bastante convincente para los usuarios comunes. Por ejemplo: un usuario [email protected] recibe un correo de [email protected]@yahoo.com

El usuario ve que el correo viene de Perico y que seguramente es alguien a quién conoce y confía en aceptar el adjunto.

Mi búsqueda se centró en crear una expresión regular que buscara las direcciones de correo que contuvieran dos arrobas. Después de bastante tiempo llegué a esto:

From =~ /(?i).*@.*@.*/i

Con esta regla efectivamente conseguí bloquear los correos con direcciones manipuladas como en el ejemplo anterior, pero por mi falta de conocimientos en Perl (y escasos de expresiones regulares) no estoy seguro de haber hecho bien el trabajo: si esta regla se saltará determinada condición o si simplemente está bien.

Cualquier comentario será muy bien recibido.

Ivan.
Saludos.
isantander
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2019-01-23 11:47 @532

Publicidad

Re: Consulta expresión regular en Perl

Notapor explorer » 2019-01-23 16:36 @733

Bienvenido a Perl en Español, isantander.

La expresión es correcta.

Otra forma de hacerlo:

$From =~ /.+?@.+?@/;

La forma ".+" ya sabes que significa "uno o más caracteres", pero cuando le sigue el '?', estamos indicando que se "pare la búsqueda" en cuanto coincida con el siguiente carácter en el patrón. '@' en este caso. Es decir: busca por un conjunto de caracteres hasta justo antes de la primera '@'. Es lo mismo que tenías, pero un poco más eficiente y rápido.

Con ".+?@" ya tenemos la primera arroba. Solo tenemos que volver a ponerlo otra vez, y listo.

No es necesario el modificador "/i" ya que estamos buscando arrobas, no letras que puedan ser minúsculas o mayúsculas.

Otra forma sería:

$From =~ /(?:.+?@){2}/;

El modificador "{2}" está indicando que queremos que lo anterior se repita dos veces. Y lo anterior es un patrón encerrado entre paréntesis. Como los paréntesis, normalmente, los usamos para capturar cosas, y no es el caso (solo estamos buscando, no extrayendo información), entonces los paréntesis tienen la forma extendida "(?:...)" que quiere decir que esos paréntesis solo están rodeando el patrón, para facilitar luego la vida al modificador "{2}".

Otra forma sería... contar las arrobas que hay en la dirección de correo:

$arrobas = $From =~ tr/@/@/;

Estamos "transliterando" cada arroba con otra (o sea, no estamos haciendo nada), y obtenemos en $arrobas el número de ellas que estén en el $From. Ese número lo deberemos comparar con 1. Por ejemplo:

if ($arrobas > 1) { say "Maligno" }

De todas maneras... ten cuidado, porque una dirección de correo no es solo lo que conocemos "alrededor" de las arrobas.

La siguiente expresión es válida como dirección de correo electrónico:

Joaquín Ferrero <"El gran programador"@gmail.com (esta dirección ya no es válida. Usar [email protected])>

Sí: todo eso es una dirección de correo. Naturalmente, hay pocas personas con una dirección tan complicada. Pero en mi empresa solemos usar tags para discriminar los correos:

[email protected]

Los correos enviados irán a [email protected], pero un filtro en el programa cliente permitirá colocar el correo en una bandeja específica. Así no se satura la bandeja de entrada.

También existe la posibilidad de incluir filtros en la propia dirección:

pille#fromdomain#[email protected] : aceptará correos para [email protected] solo si vienen de example.com

pille#before#[email protected] : aceptará correos para [email protected] solo si vienen antes del 1 de marzo de 2019.

pero estos casos son muy especiales... Lo más normal es encontrar la dirección normal y corriente, con una '@' y ya está.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta expresión regular en Perl

Notapor isantander » 2019-01-23 17:32 @772

explorer: muchas gracias por la bienvenida y por lo extensa y detallada de tu respuesta.

Me quedó mucho más claro y seguramente utilizaré algunas de tus variantes, quizás la primera para optimizar el proceso.

Como vos decís hay mucho más para analizar, incluso ya tuvimos falsos positivos en una cuenta mal configurada, al no haber completado el campo "Nombre de usuario" pone por defecto la misma cuenta, entonces quedó algo como:

[email protected]<[email protected]>

Al ser todo una sola cadena encontraba las dos "@" y lo filtraba.

Es un proceso para analizar más detalladamente, pero al menos por ahora nos da un respiro. Son muchos los correos que llegaban con la dirección manipulada de esa manera; optamos por configurar ClamAV para que elimine los correos con adjuntos de Office con macros, pero modificaron y el archivo lo pasaban como un enlace.

Y los llamados eran del tipo "no puedo abrir el archivo que bajé" y al ir los técnicos descubrían que no podían porque el antivirus no los dejaba, pero es cuestión de tiempo hasta que llegue una variante que no sea detectada.

Nuevamente, muchas gracias por tu gran respuesta.

¡Saludos!

Ivan
isantander
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2019-01-23 11:47 @532


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados