Comunidad de diseño web y desarrollo en internet online

Version comercial & versión sistemas en mail PHP

Citar            
MensajeEscrito el 21 Dic 2012 06:37 pm
Hola amigos, es un gusto saludarles, necesito de su expertise y ayuda:

Tengo un formulario que envia datos a un archivo llamado send.php. Dentro de send.php proceso los datos del formulario para guardarlos en base de datos mysql y de ahi enviar el mail a las direcciones comerciales de la empresa donde trabajo. Mi código luce así:

Código :

<?PHP 
//CONECTO A MI BASE DE DATOS
include("conexion.php");
//SELECCIONO MI BASE DE DATOS
mysql_select_db("MIBASEDEDATOS",$conexion);
//RECIBO Y DETERMINO VARIABLES
$fecha=date("Y-m-d");
$hora=date("H:m:s");
$ip_contacto=$_SERVER['REMOTE_ADDR'];
$nav_contacto=$navegador;
$dispositivo_movil=$isMobile;
$robot_contacto=$robot;
$isp_contacto=gethostbyaddr($_SERVER['REMOTE_ADDR']);
$os_contacto=$so;
$nombre_contacto=$_POST['nombre'];
$telefono_oficina=$_POST['telefono_of'];
$telefono_celular=$_POST['telefono_cel'];
$email_contacto=$_POST['email'];
$empresa_contacto=$_POST['empresa'];
$cargo_contacto=$_POST['cargo'];
$comentarios_contacto=$_POST['comentarios'];
//SELECCIONO COLUMNAS DE LA TABLA
$sql="INSERT INTO candidatos (
fecha,
hora,
ip_contacto,
nav_contacto,
dispositivo_movil,
robot_contacto,
isp_contacto,
os_contacto,
nombre_contacto,
telefono_oficina,
telefono_celular,
email_contacto,
empresa_contacto,
cargo_contacto,
comentarios_contacto,
)";
//ESCRIBO VALORES EN LA TABLA
$sql.="VALUES(
'".$fecha."',
'".$hora."',
'".$ip_contacto."',
'".$nav_contacto."',
'".$dispositivo_movil."',
'".$robot_contacto."',
'".$isp_contacto."',
'".$os_contacto."',
'".$nombre_contacto."',
'".$telefono_oficina."',
'".$telefono_celular."',
'".$email_contacto."',
'".$empresa_contacto."',
'".$cargo_contacto."',
'".$comentarios_contacto."'
)";
//VERIFICO LA INFO EN LA BASE DE DATOS
mysql_query($sql, $conexion) or die('Error: datos no guardados');;
$status="info_ok"; 
//CIERRO LA CONEXION
mysql_close();
//MAIL EN VERSION PARA VENTAS Y MARKETING
$destino_comercial="DIRECCIONES DE CORREO DE VENTAS Y MKTG";
$header = "From: Contacto desde Sitio Web:".$email_contacto."\nReply-To:".$email_contacto."\n";
$header .= "X-Mailer: PHP" . phpversion() . " \r\n";
$header .= "Mime-Version: 1.0 \r\n";
$header .= 'Content-type: text/plain;charset=utf-8' . "\r\n";
$msg.= "---------------------------------------------------------------- \n";
$msg.= "           Contacto desde la web                      \n";
$msg.= "---------------------------------------------------------------- \n";
$msg.= "Nombre: ......................... ".$nombre."\n";
$msg.= "Empresa: ......................... ".$empresa."\n";;
$msg.= "Cargo: ............................ ".$cargo."\n";;
$msg.= "Teléfono de Oficina: ........ ".$telefono_oficina."\n";
$msg.= "Teléfono celular: ............. ".$telefono_celular."\n";
$msg.= "E-mail: ............................ ".$email."\n";
$msg.= "Fecha: ............................ ".$fecha."\n";
$msg.= "Hora: .............................. ".$hora."\n";
$msg.= "---------------------------------------------------------------- \n";
$msg.= "                              Mensaje                        \n";
$msg.= "----------------------------------------------------------------- \n";
$msg.= "$comentarios.\n\n";
mail($destino_comercial, $asunto, $msg, $header);

Hasta aquí todo funciona correcto y no tengo problema. Mi duda viene al enviar un correo con información adicional a sistemas, porque me pregunto si php no tomará las variables $header y $msg, enviándome un mail con valores sobrepuestos o erróneos... El código que tengo continúa así:

Código :

//MAIL VERSION PARA SISTEMAS
$destino_sistemas="DIRECCION DE EMAIL DE SISTEMAS";
$header = "From: Contacto desde Sitio Web:".$email_contacto."\nReply-To:".$email_contacto."\n";
$header .= "X-Mailer: PHP" . phpversion() . " \r\n";
$header .= "Mime-Version: 1.0 \r\n";
$header .= 'Content-type: text/plain;charset=utf-8' . "\r\n";
$msg.= "---------------------------------------------------------------- \n";
$msg.= "           Contacto desde la web                      \n";
$msg.= "---------------------------------------------------------------- \n";
$msg.= "Nombre: ........................ ".$nombre."\n";
$msg.= "Empresa: ........................ ".$empresa."\n";;
$msg.= "Cargo: ........................... ".$cargo."\n";;
$msg.= "Teléfono de Oficina: ....... ".$telefono_oficina."\n";
$msg.= "Teléfono celular: ............ ".$telefono_celular."\n";
$msg.= "E-mail: ........................... ".$email."\n";
$msg.= "Fecha: ........................... ".$fecha."\n";
$msg.= "Hora: ............................. ".$hora."\n";
$msg.= "Dirección IP: ................... ".$ip_contacto."\n";
$msg.= "Navegador: ..................... ".$nav_contacto."\n";;
$msg.= "Dispositivo móvil: ............. ".$dispositivo_movil."\n";;
$msg.= "Robot buscador: ............. ".$robot_contacto."\n";
$msg.= "Proveedor de internet: .... ".$isp_contacto."\n";
$msg.= "Sistema operativo: ........... ".$os_contacto."\n";
$msg.= "--------------------------------------------------------------- \n";
$msg.= "                             Mensaje                        \n";
$msg.= "---------------------------------------------------------------- \n";
$msg.= "$comentarios.\n\n";
mail($destino_sistemas, $asunto, $msg, $header);
//REDIRIJO A MI "THANK-YOU" PAGE
 echo header('Location: ty.html');
?> 

Como pueden ver, el mail para sistemas contiene más información que a la gente del departamento comercial no le interesa ni sirve.

Les pido una ayudadita revisando el código e indicándome si puedo tener fallas. Acepto propuestas sobre alguna función y/o para darle mejor apariencia a los mensajes mediante HTML, pues estoy usando formato de texto plano

Muchas gracias!

Por Enrique_Arroniz

4 de clabLevel



Genero:Masculino  

Programador Web/Flash/VBasic

firefox
Citar            
MensajeEscrito el 21 Dic 2012 08:23 pm
Para lo de los mails, como siempre, usa PHP Mailer en vez de la función mail(). Es mejor en todo sentido, puedes armar mensajes de correo complejos, en formato HTML y hasta con adjuntos e imágenes embebidas llamado a cuatro cinco métodos.

Además te voy a recomendar encarecidamente que valides los datos de entrada. Esas variables $_POST entran sin más a la sentencia INSERT y es propenso a inyección de SQL. Además se podría hackear el servidor de mails de la forma que armas el mensaje.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 21 Dic 2012 08:45 pm

DriverOp escribió:

...Te voy a recomendar encarecidamente que valides los datos de entrada. Esas variables $_POST entran sin más a la sentencia INSERT y es propenso a inyección de SQL. Además se podría hackear el servidor de mails de la forma que armas el mensaje.


Tengo preguntas:


  • Validar los datos de entrada, ¿ con isset? ¿Podrias ponerme un ejemplo, por favor?
  • ¿ Cómo puedo proteger los datos contra una inyeccón SQL?
  • ¿Dónde está la vulnerabilidad que podria provocar que alguien hackeara el servidor de mail?


Te agradezco de antemano.

Por Enrique_Arroniz

4 de clabLevel



Genero:Masculino  

Programador Web/Flash/VBasic

firefox
Citar            
MensajeEscrito el 23 Dic 2012 11:35 am
Es más complicado que solo poner isset.

Cada campo tiene sus particularidades. Por ejemplo, además de verificar que $_POST['nombre'] existe, deberías verificar que no esté vacío. Y si no está vacío que tenga un largo razonable, nadie tiene un nombre con 100 caracteres. Pero es que tampoco nadie tiene un número o un caracter especial en el nombre (excepto el apostrofe, como en "O'higgins"). Si no se cumple alguna de estas condiciones, el nombre no es válido y no le servirá a la empresa para lo cual le estás haciendo esto.

Donde pides un número de teléfono, deberías verificar que la cadena de caracteres es un número de teléfono aceptando solo números y el guión medio.

Donde pides una dirección de correo electrónico, deberías verificar que sea una dirección de correo electrónico bien formada.

En el caso de "comentario" es más complicado aún porque deberás evitar que te inyecten código HTML o JavaScript.

Respecto a inyección SQL, tal como tienes el código, basta con que en $comentarios_contacto alguien escriba algo como

Código :

"); DROP candidatos;
para hacerte desaparecer la tabla. Para evitar eso deberías hacer pasar todas las variables implicadas en el INSERT por la función mysql_real_escape_string().

La función mail() siempre ha sido muy vulnerable a inyección de código. Por ejemplo, tal como tienes el código, alguien podría escribir esto en la variable $email_contacto:

Código :

[email protected]; To: [email protected];

Y te estaría enviando un correo a ti. Haciendo una lista separadas por comas, se podría usar tu formulario como pasarela para enviar spam.
Para evitar esto, yo te recomiendo que uses PHP mailer porque no se puede hacer un "hack" tan sencillo. Además de que puedes armar mensajes de correo electrónico complejos fácilmente.

Hay más cosas a tener en cuenta pero sería repetir lo que ya he escrito en este artículo en mi página web: Apéndice - Creación de un formulario web. :wink:

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 03 Ene 2013 02:59 pm
Estudiaré paso a paso lo que me comentas de acuerdo al contenido que me compartes e iré puliéndo el código.

¡Muchas gracias por hacerme ver las vulnerabilidades!

Por Enrique_Arroniz

4 de clabLevel



Genero:Masculino  

Programador Web/Flash/VBasic

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.