Foros del Web » Programando para Internet » PHP »

Seguridad Anti-spam

Estas en el tema de Seguridad Anti-spam en el foro de PHP en Foros del Web. Hola que tal, me parecio conveniente, publicar un tipo articulo que me llego al mail de mi server, que es ********. Leanlo esta interesante.- ###################################### ...
  #1 (permalink)  
Antiguo 16/12/2005, 04:18
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años
Puntos: 0
Seguridad Anti-spam

Hola que tal, me parecio conveniente, publicar un tipo articulo que me llego al mail de mi server, que es ********.
Leanlo esta interesante.-


######################################

Estimado Usuario:

ESTE ES UN ANUNCIO IMPORTANTE
Le hacemos llegar este anuncio para informarle sobre el creciente uso de una nueva modalidad de envio de e-mails masivos a través de formularios web que utilizan PHP para el envio de mails con el objetivo de enviar spam, en algunos casos, y el anonimato de los mensajes enviados en otros caso. Esta modalidad aprovecha la forma en que la función mail() de PHP funciona y se conoce como "Headers Mail Injection". La misma consiste en aprovecharse de formularios de sitios web que utilicen la función mail() de PHP para el envio de los datos ingresados por el visitante y que además estos, no validen los datos en forma correcta para evitar este tipo de abusos.


¿Cómo funciona esta modalidad?
Para explicarlo vamos a basarnos en un ejemplo simple, supongamos que nuestro sitio dispone de un campo para el ingreso del e-mail por parte del visitante de la siguiente forma:

Código HTML:
<input name="email" type="text" value="Ingrese su e-mail aqui" /> 
luego, la dirección ingresada en este campo es enviada al servidor y es tomada por el script PHP para ser utilizada como FROM en la función mail() y de esta manera el mensaje que nos llega a nuestro correo tendrá como remitente la dirección ingresada por el visitante. Ahora bien, la función mail() de PHP

Código PHP:
mail(recipienteasuntomensajecabeceras extras); 
simplemente concatena los parametros que le son pasados, por lo cual, si en el campo mail del formulario ingresamos lo siguiente:

"[email protected]%0ACc:[email protected]%0ABcc :[email protected],[email protected]"

donde la primera dirección será el FROM: (dirección de origen que llegará a las víctimas del spam), %0A es el valor hexadecimal del caracter de salto de línea <LF>, Cc: (Copias) contiene la dirección o direcciones de las víctimas y Bcc: (Copias ocultas) contiene también direcciones de las víctimas del spam.

Parte de la cabecera del e-mail generado por nuestro formulario abusado será:
To: [email protected]
Subject: Asunto del mensaje
From: [email protected]
Cc:[email protected]
Bcc:[email protected],[email protected]
Con esto, el spammer habrá utilizado nuestro formulario para el envio de correo masivo a través de nuestro formulario.

El ejemplo visto es el caso más básico de esta modalidad ya que a través de la inyección de cabeceras se puede incluso modificar el asunto y hasta el mensaje en si mismo hasta el punto de poder enviar mensajes con contenido html.


¿Qué consecuencias tiene esta modalidad?
En primer lugar, nuestro formulario está siendo usado para llevar a cabo un acto con el cual la gran mayoría de nosotros estamos en desacuerdo, también se está haciendo uso del ancho de banda disponible para el servidor afectando al resto e los sitios alojados en el mismo, por lo cual, el sitio en cuestión será suspendido hasta que el inconveniente sea resuelto, por último, ante una denuncia de spam, dicha cuenta deberá ser suspendida de acuerdo a lo previsto en legales de nuestro sitio. Es responsabilidad de cada usuario el utilizar código lo suficientemente seguro en su sitio web y corregir esto si fuera necesario.


¿Cómo evitar la utilización de nuestro formulario?
Ante todo, cabe aclarar que esta modalidad se da únicamente en formularios que utilizan la función mail() de PHP para procesar y enviar los datos ingresados por el visitante.

Si utiliza algún script de PHP no elaborado por Ud. como formailphp, por favor, actualice el mismo con la versión más reciente verficando que brinde una solución a este tipo de actividad.

Si utiliza un script PHP creado por Ud. o posee los conocimientos como para editar el mismo, aquí incorporamos una función que puede utilizar para validar los datos ingresados de forma eficiente.
Código PHP:
                    <?php 
  
function ValidarDatos($campo){
    
//Array con las posibles cabeceras a utilizar por un spammer
    
$badHeads = array("Content-Type:",
                                 
"MIME-Version:",
                                 
"Content-Transfer-Encoding:",
                                 
"Return-path:",
                                 
"Subject:",
                                 
"From:",
                                 
"Envelope-to:",
                                 
"To:",
                                 
"bcc:",
                                 
"cc:");
    
//Comprobamos que entre los datos no se encuentre alguna de
    //las cadenas del array. Si se encuentra alguna cadena se
    //dirige a una página de Forbidden
    
foreach($badHeads as $valor){ 
      if(
strpos(strtolower($campo), strtolower($valor)) !== false){ 
        
header("HTTP/1.0 403 Forbidden"); 
        exit; 
      }
    } 
  }
  
//Ejemplo de llamadas a la funcion
  
ValidarDatos($_POST['email']);
  
ValidarDatos($_POST['asunto']);
  
ValidarDatos($_POST['mensaje']);
?>

######################################

Es tarde por eso no lo resumi, pero bueno mejor asi lo leen bien
Salu2 espero les sirva.-
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-

Última edición por jam1138; 16/12/2005 a las 04:40
  #2 (permalink)  
Antiguo 16/12/2005, 04:41
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Gracias por compartir la información. Solo me permití editarlo para una mejor lectura.

Saludos!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #3 (permalink)  
Antiguo 16/12/2005, 10:16
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años
Puntos: 0
Ningun problema Jam, es mas gracias.
Salu2.-
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #4 (permalink)  
Antiguo 16/12/2005, 12:14
 
Fecha de Ingreso: septiembre-2005
Mensajes: 17
Antigüedad: 18 años, 7 meses
Puntos: 0
Exclamación Server amenaza con cerrar mi cuenta. Ayuda!!!

Hola amigos:

A mi tambien me llego el mail de alerta desde mi server, pero con el agravante de que amenazan con suspender mi cuenta ! No tengo los conocimientos para poder editar el codigo que brindan en este mail para efectuar una validacion de datos. No se que hacer...por favor ayudenme!
Aqui agrego mi codigo php para que puedan darme una mano. Gracias.


Código PHP:
<?

$adminaddress 
"[email protected]"

 
$siteaddress ="http://www.xxxx.com"


$sitename "xxxx"


$date date("m/d/Y H:i:s");


if (
$REMOTE_ADDR == ""$ip "no ip";
else 
$ip getHostByAddr($REMOTE_ADDR);



IF (
$action != ""): 
mail("$adminaddress","Informacion"
"Informacion enviada a: Admin @ $sitename \n
Nombre: $fname 
Asunto: $subject
Email: $email
Mensaje:
------------------------------
$comments
------------------------------

Informacion remota :
------------------------------
Navegador: $HTTP_USER_AGENT
Direccion Host : $ip
Direccion IP: $REMOTE_ADDR
Dia/Hora:  $date"
,"FROM:$adminaddress"); 



mail("$email","Gracias por visitar $sitename""Hola $fname:\n
Gracias por visitar $sitename!\n
Atentamente,\n
XXXX.
$siteaddress"
,"FROM:$adminaddress"); 


$sendresult "OK! Verifique su casilla de email.";
$send_answer "answer=";
$send_answer .= rawurlencode($sendresult);
echo 
"$send_answer";

ENDIF;
?>

Última edición por jam1138; 16/12/2005 a las 18:03
  #5 (permalink)  
Antiguo 16/12/2005, 14:00
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Cita:
Iniciado por trymenow
Hola amigos:

A mi tambien me llego el mail de alerta desde mi server, pero con el agravante de que amenazan con suspender mi cuenta ! No tengo los conocimientos para poder editar el codigo que brindan en este mail para efectuar una validacion de datos. No se que hacer...por favor ayudenme!
Aqui agrego mi codigo php para que puedan darme una mano. Gracias.
Primero que nada no das los suficientes datos como para ayudarte, o por lo menos no los veo. Segundo abrir un thread nuevo para no desvirtuar este tema no es malo, podrias abrirlo. Segundo, para solucionarlo tendrias que usar la función que se posteo y pasar por la función cada variable que crees que pueda ser la causal de esto.

------------------------

Znet gracias por postear la info, ya habia leido algo sobre esto y no me habia quedado muy claro. Al parecer también tendremos que empezar a tener cuidado sobre los envios de mail, no alcanzaba con tener que cuidarnos con los formularios y la insersion de SQL que también los mail .

Saludos y gracias nuevamente.
  #6 (permalink)  
Antiguo 16/12/2005, 16:12
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 meses
Puntos: 0
A ver:

Por lo que se ve, el abuso se basa en ingresar en un campo tipo text una serie de datos (muchas direcciones email).

Me pregunto si la solución no será tan simple como limitar el número de caracteres en el campo mail con maxlength.

Me parece tan sencillo, que ni yo mismo me lo creo. Pero parece lógico.

Además, casi todos los scripts que usamos para enviar el email, verifican que el email sea correcto y una dirección de este tipo sería rechazada.

Saludos.

Última edición por javifo; 16/12/2005 a las 16:19
  #7 (permalink)  
Antiguo 16/12/2005, 22:56
Avatar de MoDoRrO  
Fecha de Ingreso: septiembre-2005
Ubicación: Php+Flash+AS
Mensajes: 1.072
Antigüedad: 18 años, 7 meses
Puntos: 12
a mi tambien me llego un email de mi server
pero no le entendi :S

kien me puede orientar en esto?


Última edición por jam1138; 17/12/2005 a las 00:08
  #8 (permalink)  
Antiguo 17/12/2005, 01:25
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 meses
Puntos: 0
Hola.

Desde luego, la solución de poner maxlength en el campo mail, como dije ayer, funciona si el intento de abuso se hace desde la página. En este caso, se corta la cadena al número de caracteres que haya predeterminados y el script de envío se ejecutaría enviando el email a una dirección que no existe.

Eso si no hay validación en el script de envío. Si la hay y está bien, ni se enviaría. Daría error.

Otra cuestión es si el form lo envían desde otra página. En este caso, el maxlength no actuaría como es obvio y si no hay verificación del lado servidor (en el script de envío), entonces sí que se ejecutaría y se enviaría el spam.
Me parece de todas formas que es este caso el tiempo de ejecución del script, actuaría. (no estoy seguro).

La solución en todo caso es sencilla:

- Control del campo mail del lado servidor antes de ejecutar el script con:

*verificación de la expresión regular que llega del campo mail.
*limitación del número de caracteres que llegan.
*verificación de que lleguen de la página donde tenemos el form.

Es decir, poniendo toda la seguridad del lado servidor.

Yo lo veo así, pero más opiniones serían muy interesantes.

Saludos.
  #9 (permalink)  
Antiguo 19/12/2005, 12:25
 
Fecha de Ingreso: marzo-2003
Mensajes: 29
Antigüedad: 21 años
Puntos: 0
Saludos a todos;

Mi proveedor de hosting también me ha enviado el mismo mensaje alertándome sobre el mal uso de los formularios a través de la función mail(), también me adjuntó una sugerencia de código para colocarlo.

Quisiera saber si alguien puede ayudarme para editar mi archivo correctamente y evitar el mal uso de mis formularios.

Para enviar los correos utilizo los tres archivos.

1.- buzon.htm (El usuario ingresa sus datos desde una página HTML, para lo cual utilizo esta llamada:

<form enctype='multipart/form-data' action='process.php' method='post'>)
2.- process.php
3.- global.inc.php

A continuación pongo el código de process.php:

Código PHP:
<?php
include("global.inc.php");
$errors=0;
$error="Se encontraron los siguientes errores mientras se intentaba enviar su formulario.<ul>";
pt_register('POST','Nombre');
pt_register('POST','PrimerApellido');
pt_register('POST','SegundoApellido');
pt_register('POST','Domicilio');
pt_register('POST','Telefono');
pt_register('POST','Email');
pt_register('POST','ServidorPublico');
pt_register('POST','Hechosqueconstituyenladenuncia');
$Hechosqueconstituyenladenuncia=preg_replace("/(\015\012)|(\015)|(\012)/","&nbsp;<br />"$Hechosqueconstituyenladenuncia);if($Nombre=="" || $PrimerApellido=="" || $Domicilio=="" || $Telefono=="" || $Email=="" || $ServidorPublico=="" || $Hechosqueconstituyenladenuncia=="" ){
$errors=1;
$error.="<li>No ingresó uno o más de los campos requeridos. Por favor regrese e intente de nuevo.";
}
if(!
eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$Email)){
$error.="<li>Dirección de correo inválida";
$errors=1;
}
if(
$errors==1) echo $error;
else{
$where_form_is="http".($HTTP_SERVER_VARS["HTTPS"]=="on"?"s":"")."://".$SERVER_NAME.strrev(strstr(strrev($PHP_SELF),"/"));
$message="Nombre: ".$Nombre."
Primer Apellido: "
.$PrimerApellido."
Segundo Apellido: "
.$SegundoApellido."
Domicilio: "
.$Domicilio."
Telefono: "
.$Telefono."
Email: "
.$Email."
Servidor Publico: "
.$ServidorPublico."
Hechos que constituyen la denuncia: "
.$Hechosqueconstituyenladenuncia."
"
;
$message stripslashes($message);
mail("[email protected]","Formulario de quejas",$message,"From: phpFormGenerator");

header("Refresh: 0;url=http://www.midominio.com/formularios/use/denuncia/gracias.htm");
?><?php 
}
?>
Aquí está el código de global.inc.php

Código PHP:
<?php

function pt_register()
{
  
$num_args func_num_args();
   
$vars = array();

   if (
$num_args >= 2) {
       
$method strtoupper(func_get_arg(0));

       if ((
$method != 'SESSION') && ($method != 'GET') && ($method != 'POST') && ($method != 'SERVER') && ($method != 'COOKIE') && ($method != 'ENV')) {
           die(
'The first argument of pt_register must be one of the following: GET, POST, SESSION, SERVER, COOKIE, or ENV');
     }

       
$varname "HTTP_{$method}_VARS";
      global ${
$varname};

       for (
$i 1$i $num_args$i++) {
           
$parameter func_get_arg($i);

           if (isset(${
$varname}[$parameter])) {
               global $
$parameter;
               $
$parameter = ${$varname}[$parameter];
          }

       }

   } else {
       die(
'You must specify at least two arguments');
   }

}

?>
El código que me sugiere mi proveedor, para evitar el mal uso del formulario es el siguiente:

Código PHP:
<?php 
  
function ValidarDatos($campo){
    
//Array con las posibles cabeceras a utilizar por un spammer
    
$badHeads = array("Content-Type:",
                                 
"MIME-Version:",
                                 
"Content-Transfer-Encoding:",
                                 
"Return-path:",
                                 
"Subject:",
                                 
"From:",
                                 
"Envelope-to:",
                                 
"To:",
                                 
"bcc:",
                                 
"cc:");

    
//Comprobamos que entre los datos no se encuentre alguna de
    //las cadenas del array. Si se encuentra alguna cadena se
    //dirige a una página de Forbidden
    
foreach($badHeads as $valor){ 
      if(
strpos(strtolower($campo), strtolower($valor)) !== false){ 
        
header("HTTP/1.0 403 Forbidden"); 
        exit; 
      }
    } 
  }

  
//Ejemplo de llamadas a la funcion
  
ValidarDatos($_POST['email']);
  
ValidarDatos($_POST['asunto']);
  
ValidarDatos($_POST['mensaje']);
?>
Ahora bien, no sé en qué parte debo colocar el código de comprobación y si tengo que corregirle algo; yo estoy suponiendo que debo ponerlo antes de:
mail("[email protected]","Formulario de quejas",$message,"From: phpFormGenerator")
Pero en realidad no sé.
¿Alguien puede indicarme en qué parte del código debo poner la cuestión de validarlos datos y si a ese código debo corregirle algo?

Mil gracias!
__________________
¿Cómo podrás tú, un hombre común, ajeno a los poderosos caminos de la Fuerza, triunfar por encima de uno de los asesinos más peligrosos de la Galaxia?
  #10 (permalink)  
Antiguo 19/12/2005, 14:10
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Cita:
Iniciado por javifo
A ver:

Por lo que se ve, el abuso se basa en ingresar en un campo tipo text una serie de datos (muchas direcciones email).

Me pregunto si la solución no será tan simple como limitar el número de caracteres en el campo mail con maxlength.

Me parece tan sencillo, que ni yo mismo me lo creo. Pero parece lógico.

Además, casi todos los scripts que usamos para enviar el email, verifican que el email sea correcto y una dirección de este tipo sería rechazada.

Saludos.
Buenas. Si mal no recuerdo lo que lei hace un tiempito, este tipo de ataque no solo se limita al campo del mail al que se le enviara, también puede ir dentro del campo donde escribe el mensaje, el titulo del mail y demas. No es un ataque comun y normal pero si demasiado ingenioso, según una guia en una pagina de "hacker's" decia que de un control a 100 paginas (que contenian un formulario de este tipo) el 50% de estas podian ser atacadas no en todas de la misma manera, forma, pero si logrando algun tipo de ataque. No se que tan fiable pueden ser estos datos pero es algo que esta dando vuelta en la red, tal vez sea una fake pero no les sabria decir.

Saludos y suerte.
  #11 (permalink)  
Antiguo 19/12/2005, 22:01
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 19 años, 10 meses
Puntos: 0
A mi me parece que deberíamos empezar por el principio, antes de agregar seguridad extra o que desconocemos a nuestros formularios sería bueno saber si los mismos pueden ser usados para este fin.
En mi caso introduje el ejemplo del supuesto spammer en todos los campos de mis formularios (por supuesto cambiando los datos para que me llegaran a mi) y no sucedió nada, el envío se realizó tomando esa cadena como si fuese un dato real.
Entonces sugiero que se publiquen aquí otros códigos para probar la vulnerabilidad de los formularios, yo los ignoro, pero seguramente alguien sabe de alguno.
Saludos.
Dieter.
  #12 (permalink)  
Antiguo 20/12/2005, 12:05
 
Fecha de Ingreso: marzo-2003
Mensajes: 29
Antigüedad: 21 años
Puntos: 0
Saludos Dietercito,

Mi proveedor me ha dicho que mis formularios SÍ pueden ser usados para ese tipo de actividades, de hecho, me dicen que si no agrego la seguridad necesaria mi sitio puede ser suspedido. Es por eso que necesito hacer los ajustes correspondientes.
__________________
¿Cómo podrás tú, un hombre común, ajeno a los poderosos caminos de la Fuerza, triunfar por encima de uno de los asesinos más peligrosos de la Galaxia?
  #13 (permalink)  
Antiguo 20/12/2005, 22:32
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 19 años, 10 meses
Puntos: 0
Perfecto, no lo dudo, en este mismo thread se ha afirmado que existen muchas maneras de hacerlo y que adaptando el código al formulario en cuestión mas del 50% son vulnerables.
Pero lo digo de otra manera: ¿No deberíamos tener ejemplos para probar si luego de implementados los scripts de validación estos funcionan?.

Y por favor, cuando hayas podido solucionar lo de tus formulaios, me ayudas con los míos?
Gracias.
  #14 (permalink)  
Antiguo 21/12/2005, 14:37
 
Fecha de Ingreso: marzo-2003
Mensajes: 29
Antigüedad: 21 años
Puntos: 0
Estoy de acuerdo con eso de los ejemplos.

Mientras tanto voy a esperar si alguien puede ayudarme a adaptar el código de validación, pues si no lo coloco pueden dar de baja mi sitio.

Aunque quizás debiera abrir un nuevo tema, pues me parece que este no está siendo leído por los miembros.

Hasta pronto.
__________________
¿Cómo podrás tú, un hombre común, ajeno a los poderosos caminos de la Fuerza, triunfar por encima de uno de los asesinos más peligrosos de la Galaxia?
  #15 (permalink)  
Antiguo 21/12/2005, 14:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mm Tiene ya 192 lecturas .. (a la fecha).

Lo que pasa será que no todo el mundo le toma el peso al problema .. o entienden por qué sucede o han probado alguno de los ejemplos que han descrito y no ha pasado nada ... En fin, ... siempre toda validación y pensando en "no fiarse de nada de lo que provenga externo" es lo que hay que hacer ..

Por otro lado .. mm sobre el problema de que en un campo de un formulario donde se pida una dirección de e-mail puedan introducir cualquier cosa .. por mi parte siempre he validado ese tipo de campos con expresiones regulares como la que describe esta FAQ:

http://www.forosdelweb.com/showthrea...423#post333423

Y .. con eso sólo sobra (o por lo menos en mis pruebas no ha pasado las valiciones de esa expresión regular al intentar poner cosas como direcciones de e-mail separadas por ; .. o , ...). Con respecto a los otros campos como el cuerpo del mensaje ... o en el asunto intentar colocar cabeceras HTTP .. realmente no he tenido problemas.

Usé cosas tipo
(en el asunto) TO: [email protected]\nEl Asunto ..

Relamente no sé que tipo de MTA's interpreten como una "cabecera" (que desde la función mail() de PHP va en otro parámetro de la misma) como una cabera legal en un "asunto" o cuerpo del mensaje (que esté codificado para que sea de "content-type" como HTML/texto plano ...)

No obstante .. ya comento que todo filtrado es bueno por muy "paranoico" que pueda ser este.

Un saludo,
  #16 (permalink)  
Antiguo 22/02/2006, 19:32
 
Fecha de Ingreso: marzo-2002
Mensajes: 299
Antigüedad: 22 años, 1 mes
Puntos: 1
cuál es realmente la vulnerabilidad de mail??

Hola!!

Bueno pues, hasta que no tienes el problema ni te preocupas.

Nos han notificado que nuestras páginas están siendo utilizadas para envio de correo masivo y pues como es sabido por todos eso es muy muy molesto.

Revisando este foro y basicamente este post creí que era una base para comprender lo de la vulnerabilidad de mail, pero la verdad es que ahora me siento como un byte perdido en la red :(, porque haciendo pruebas con la función simple que tengo en mi page de envío de correo, no hace el envío masivo.

Más claro:

En mi page de envío tengo la función mail de la siguiente manera:

mail("[email protected]", "$campoAsunto", "$comentario", "From: $campoNombre <$campoEmail>");


La prueba que hice, es escribiendo desde el form algunas cabeceras que como se ha indicado en este foro son usadas para hacer spam, como esto:

en cualquiera de los campos he escrito las siguientes cabeceras:

Subject:Cuentas anexas ,From:[email protected], To:[email protected],bcc:[email protected], cc:[email protected]

Las cuentas son válidas y estos datos no se envían a las cuentas anexas.

Lo que me gustaría saber es si ustedes ya hicieron pruebas de este tipo, o si me pueden orientar más o si conoces de algún link donde se específique más y información y que sea diferente al post inicial (porque lo que yo he encontrado en la web es lo mismo).

Desde ya gracias!!
  #17 (permalink)  
Antiguo 23/02/2006, 06:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Por mi parte no conozco al detalle como funcionan los MTA para identificar e interpretar cabeceras ..

Lo que si que veo que en tu caso (Serenety) tu usas el standard que define el protocolo SMTP para definir una dirección:

From: $campoNombre <$campoEmail>

(con los "<....>")

Los otros ejemplos que he visto en este mensaje no lo usan .. por ende tal vez por ahí se presten a esas "inyecciones" de otras cabeceras por ese médio.

Pero tambien podría ser que sea una "vulnerabilidad" de cierto MTA (sendmail? .. no sé)

Un saludo,
  #18 (permalink)  
Antiguo 23/02/2006, 10:09
 
Fecha de Ingreso: marzo-2003
Mensajes: 29
Antigüedad: 21 años
Puntos: 0
Saludos Serenity,

Yo hice las mismas pruebas que tú sin éxito, el envío masivo no funcionó; no al menos como se supone. Así que lo dejé.

Sin embargo mi proveedor de hosting volvió a enviarme la advertencia la semana pasada y un par de días después de ello. Encontré en mi correo, a donde se supone que llegan los formularios, un par de mensajes que fueron enviados desde mi página.

Uno de los dos mensajes contenía basura (me imagino que con el que hicieron las pruebas). Y el otro contenía las cabeceras:
MIME-Version Algo:
Subject: El predeterminado por mi formulario
Nombre: Basura
Empresa: Basura
Email: [email protected]
Telefono: 5555555555
bcc:[email protected]
cc:[email protected]
Comentarios adicionales: Texto en inglés, parece que de publicidad de algo

Lamentablemente, en un descuido borré ese mensaje y no recuerdo exactamente el contenido. ¿Cómo fue que lo enviaron? no lo sé, pero por supuesto me hizo sospechar que utilizaron mi formulario para envío masivo -sobre todo despues de haber recibido la advertencia de mi proveedor-

Así que volví a postear aquí solicitando ayuda:

http://www.forosdelweb.com/f18/seguridad-formulario-371366/

Coloqué el código que me sugirió mi proveedor de hosting y hasta ahora no se ha vuelto a repetir el incidente; sin embargo, no estoy seguro de que funcione correctamente. Más bien lo incluí para cumplir con la sugerencia...
__________________
¿Cómo podrás tú, un hombre común, ajeno a los poderosos caminos de la Fuerza, triunfar por encima de uno de los asesinos más peligrosos de la Galaxia?
  #19 (permalink)  
Antiguo 23/02/2006, 10:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Bueno .. es que también la validación que sugiere tu proveedor no hace más que evitar que se envien con tu formulario un spam masivo.

Pero lo que no parece que validan es "que" formulario HTML usa tu script PHP de proceso de envio del e-mail. Es decir de "que" domino llegan los datos como para dejar o no realizar el proceso de envio.

Por ende .. imagina la situación:

1) Domino A.com .. ahí tengo mi formulario HTML o script PHP para automatizar el proceso.
2) Dominio B.com .. donde está tu script que envia el e-mail: enviar_mail.php

Tu script "enviar_mail.php" toma las variables por el "metodo" que le llegen (sea POST o GET) .. pero no -atiende- de donde provienen. SI eso se produce ..yo desde domino A.com voy a usar tu script de proceso de envio de e-mail .. y si a eso le sumas que el "para" lo dejas libre como una variable que llega desde tu formulario .. ahí es donde "doy el cambiazo" y pongo otro e-mail. En este caso estaría usando tu infraestructura (tus própios scripts PHP genéricos de envio del e-mail) para enviar un e-mail mio.

No sé si será esto último tu caso (no sé si "fijas" el "para" como destinatario o no) pero antiguamente con los típicos "form mailer" genéricos que se usaban mucho sucedía este problema.

Hoy en día y lo que reporta tu proveedor como fallo de seguridad supuestamente es que usan las cabeceras HTTP que en "mail()" se ponen tal cual y en ella suele "caer" alguna variable PHP proveniente del formulario directamente (para indicar un "from .." o algo así) para componer otra cabecera para el e-mail con otras direcciones de envio con CC (copia) o BCC ...

Un saludo,
  #20 (permalink)  
Antiguo 13/07/2006, 00:23
 
Fecha de Ingreso: junio-2004
Mensajes: 37
Antigüedad: 19 años, 10 meses
Puntos: 0
Necesito agregar seguridad al siguiente formulario.
Mi intención es evitar que se pueda ingresar directamente al código php sin pasar por el html.
Le he agregado un campo oculto a modo de password pero no lo veo del todo seguro, no he podido con $PHP_SELF para restringior el acceso.
También me gustaría poder validar selectivamente, por ejemplo, evitar que en el campo e-mail aparezca una coma o un punto y coma, todo del lado servidor.
Todo ello para evitar el uso malintencionado de la función mail.
Desde ya agradecido

página inicial en html

Código PHP:
<html>
<
body>
<
form method="POST" action="2.php">
  <
input name="nombre"><p>
  <
input name="email"></p>
  <
textarea name="comentarios"></textarea></p>
  <
input type="submit" value="Enviar" name="submit">
  <
input type="hidden" name="validar" value="codigo">
</
form>
</
body>
</
html
página PHP de proceso y envío

Código PHP:
<?
if ($validar != "codigo")
{
echo 
"no autorizado";
exit();
}
?>

<? echo $nombre?><p>
<? echo $email?><p>
<? echo $comentarios?><p>
        
<?
// Enviar por e-mail
 
$contenido .= "Nombre: " $nombre "\n";
 
$contenido .= "E-Mail: " $email "\n";
 
$contenido .= "Comentarios: " $comentarios "\n";

$headers .= "From: Mi Nombre <[email protected]>\r\n"
$headers .= "Bcc: [email protected]\r\n"

 
mail ("[email protected]""Asunto"$contenido$headers);
?>
  #21 (permalink)  
Antiguo 13/07/2006, 07:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Parte de la seguridad que debes implementar está en como recoges tus variables del formulario .. debes usar los arrays supeglobales:

En lugar de acceder directamente a $nombre .. usa $_POST['nombre'] y así con el resto ..

Para la otra seguridad que requieres .. lo ideal es usar sesiones (www.php.net/session) .. Creas una variable de sesión en tu formulario HTML y la lees (validas) en el script de envio del e-mail. De esta forma si entro directo a tu script de envio .. no existirá la variable de sesión y en consecuencia detectaras un acceso no autorizado "directo".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #22 (permalink)  
Antiguo 17/11/2006, 05:29
 
Fecha de Ingreso: noviembre-2006
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Y no es mejor, proteger los archivos que hacen el envio con una contraseña? tipo

if(!session_is_registered("passENVIO")) die();

y en un principio, hacer un loggin y que al ser correcto, registre la sesion passENVIO.

Nuse, es una solucion rapida jeje :D
  #23 (permalink)  
Antiguo 17/11/2006, 06:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por linkito Ver Mensaje
Y no es mejor, proteger los archivos que hacen el envio con una contraseña? tipo

if(!session_is_registered("passENVIO")) die();

y en un principio, hacer un loggin y que al ser correcto, registre la sesion passENVIO.

Nuse, es una solucion rapida jeje :D
Cuando tienes un formulario tipo "de contacto" donde el usuario no va a estar autentificado para hacer uso de ese "formulario" y que el mismo genera/envia un e-mail .. no puedes usar como comentas autentificación, pero sí que puedes usar sesiones en el sentido de crear una variable de sesión en el script del "formulario" y validar su existencia en el script del proceso (envio del e-mail) .. así aseguras que no entran directos a "inyectar" datos en tu script PHP de proceso por -otros- formularios.

------------------------

Por otro lado ...

El uso de "session_is_registered()" ya está desfasado y no es recomendable su uso .. revisa la documentación oficial sobre sesiones y ponte al día (aquí se habla mucho de sesiones .. usa el buscador y veras muchos temas interesantes).

www.php.net/session

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 01:10.