Foros del Web » Programando para Internet » PHP »

cómo evitar e-mail injection

Estas en el tema de cómo evitar e-mail injection en el foro de PHP en Foros del Web. Hola, buenas tardes/noches. Estoy reforzando la seguridad de mis formularios de contacto, ya me ocupe de las validaciones por javascript y ahora quiero evitar el ...
  #1 (permalink)  
Antiguo 02/02/2010, 18:30
 
Fecha de Ingreso: agosto-2004
Mensajes: 113
Antigüedad: 20 años, 2 meses
Puntos: 0
cómo evitar e-mail injection

Hola, buenas tardes/noches.
Estoy reforzando la seguridad de mis formularios de contacto, ya me ocupe de las validaciones por javascript y ahora quiero evitar el spam (sin captcha).
Encontre esta función en muchos sitios, incluído foros del web, pero no se cómo usarlo.
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']);
?>
mi formulario es
Código PHP:
<?php
if($Submit){

@
$Nombre $_POST['Nombre'];
@
$Email $_POST['Email'];
@
$Consulta $_POST['Consulta'];

//************************************************************************/
$header "From:[email protected]>\n";
$header .= "To: ".$receptor."\n";
$header .= "X-Mailer: PHP4\n"//mailer
$header .= "MIME-Version: 1.0\n";
$header .= "Reply-To: ".$Email."\n";
$header .= "Content-type: text/html; charset=iso-8859-1\n";
//************************************************************************/


$cuerpo "todos los datos";

mail($receptor,'asunto',$cuerpo,$header);
}
?>
cómo inserto la función ValidarDatos dentro de mi formulario?
muchas gracias
Germán
  #2 (permalink)  
Antiguo 02/02/2010, 18:38
Avatar de jamesjara  
Fecha de Ingreso: mayo-2008
Ubicación: san jose
Mensajes: 449
Antigüedad: 16 años, 6 meses
Puntos: 7
Respuesta: cómo evitar e-mail injection

Ahi mismo tiene un ejemplo //Ejemplo de llamadas a la funcion ValidarDatos($_POST['email']);
ValidarDatos( VARIABLE );

Código PHP:
@$Nombre ValidarDatos$_POST['Nombre']);
@
$Email ValidarDatos($_POST['Email']);
@
$Consulta ValidarDatos($_POST['Consulta']); 
Porcierto y receptor?
__________________
X7CLOUD El webservice latino!
Compatible
con mysql,sql,sqlitte.
Compatible con extjs , sencha , smargwt, Gwt , Jquery , Charts, Streaming.
  #3 (permalink)  
Antiguo 02/02/2010, 20:47
 
Fecha de Ingreso: agosto-2004
Mensajes: 113
Antigüedad: 20 años, 2 meses
Puntos: 0
Respuesta: cómo evitar e-mail injection

Hola, gracias por la respuesta.
Al receptor lo tomo de una base de datos de acuerdo al identificador del formulario.
No puse el formulario completo porque no venía al caso.
Muchas gracias nuevamente
Germán

//EDITO//
Después de probar el php así
Código PHP:
<?php
  
function ValidarDatos($campo){
    
$badHeads = array("Content-Type:",
                                 
"MIME-Version:",
                                 
"Content-Transfer-Encoding:",
                                 
"Return-path:",
                                 
"Subject:",
                                 
"From:",
                                 
"Envelope-to:",
                                 
"To:",
                                 
"bcc:",
                                 
"cc:");

    foreach(
$badHeads as $valor){
      if(
strpos(strtolower($campo), strtolower($valor)) !== false){
        
header("HTTP/1.0 403 Forbidden");
        exit;
      }
    }
  } 
@
$Nombre ValidarDatos($_POST['Nombre']);
@
$Email ValidarDatos($_POST['Email']);
@
$Consulta ValidarDatos($_POST['Consulta']); 


//************************************************************************/
$header "From:[email protected]>\n";
$header .= "To: ".$receptor."\n";
$header .= "X-Mailer: PHP4\n"//mailer
$header .= "MIME-Version: 1.0\n";
$header .= "Reply-To: ".$Email."\n";
$header .= "Content-type: text/html; charset=iso-8859-1\n";
//************************************************************************/


$cuerpo "todos los datos";

mail($receptor,'asunto',$cuerpo,$header);
}
?>
todos los campos que tienen ValidarDatos llegan vacios, el mail se sigue enviando pero sin nada.
Gracias
Germán

Última edición por moquehua; 02/02/2010 a las 21:50
  #4 (permalink)  
Antiguo 02/02/2010, 23:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: cómo evitar e-mail injection

amigos, por favor repasen el manual de PHP ... ;)

la función ValidarDatos() no tiene return en ninguna parte, por ende se elimina el valor de las variables al utilizar dicha función en cada asignación...

así que hay dos panoramas: se agrega return para devolver el valor en la función, o simplemente se valida primero... pero sin re-asignar variable alguna...


suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 24/08/2010, 07:14
Avatar de Abriuschi  
Fecha de Ingreso: marzo-2010
Ubicación: Franck Santa Fe Argentina
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: cómo evitar e-mail injection

Yo no usaria esa funcion así.
Lo que haces es Capturar la variables del formulario y mandarla a una varible.

Código:
$Nombre = $_POST['Nombre'];
$Email = $_POST['Email'];
$Consulta = $_POST['Consulta'];
Despues usas la función por cada variable que quieras chequear.

Código:
  
ValidarDatos($Nombre);
ValidarDatos($Email);
ValidarDatos($Consulta);
Y abajo envias el mail:

Código:
mail($Email,$Nombre,$Consulta,$header);
Si la función encuentra algo que no le gusta redirige la página a un forbidden.
Si no encuentra solo envia el mail.

Saludos.

Etiquetas: e-mail, injection
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 16:54.