2011-07-06 13 views
7

Tengo un formulario de contacto HTML manejado por PHP en mi sitio. Actualmente uso la función PHP mail(). Por eso tengo que hacer muchas validaciones de entrada de usuario para evitar email header injection attacks. Creo que estoy seguro, pero probablemente olvidé algo y quiero pasar a una sólida biblioteca de correo electrónico PHP. La biblioteca que seleccioné es Swiftmailer.¿Qué tan seguro puede ser un formulario de contacto HTML impulsado por PHP usando Swiftmailer?

Ahora quiero comprobar si SwiftMailer aborda los siguientes:

  1. Elimina o escapar < y > caracteres en los nombres de remitentes.
  2. Elimina las nuevas líneas (\n, \r\n ...) de los nombres del remitente.
  3. Elimina o escapa de nuevas líneas del asunto del correo electrónico.
  4. Normaliza las nuevas líneas en el cuerpo del mensaje (el contenido del correo electrónico). Según los documentos PHP, \n se debe utilizar en el contenido y \r\n como separador de encabezados de correo electrónico.

PD: Intenté contactar al equipo de Swiftmailer con mis preguntas sin éxito, así que lo estoy intentando aquí.

Editar:

hice algunos casos de prueba con SwiftMailer y esto es lo que he encontrado hasta ahora:

  1. Cuando se tiene un < o > en el nombre de un remitente, se obtiene a No se pudo entregar correo electrónico de error. Esto de alguna manera puede conducir en un DOS attack de su servidor de correo (tal vez estoy equivocado). ¡¿Esto es normal?!
  2. Las líneas nuevas se escapan por lo que el ataque de inyección falla.
  3. Las líneas nuevas se escapan por lo que el ataque de inyección falla.
  4. Probado pero no puedo ver qué hace Swiftmailer (si hace algo). Así que todavía estoy en la oscuridad aquí.

¿Puede alguien aclarar los números 1 y 4 por mí? No estoy seguro si es un comportamiento normal ...

+6

Usted puede mirar siempre a través del código de ...Swiftmailer es solo un script PHP, después de todo. Si eres tan paranoico con las vulnerabilidades, probablemente quieras auditar las bibliotecas externas de todos modos. –

+2

'Proteger de los ataques de inyección de encabezado sin eliminar contenido de solicitud de datos (desde la página de inicio) y de un escaneo aproximado a través del código Supongo que si transfiere algo que no es válido, obtendrá una excepción en lugar de aceptación silenciosa . – hakre

+1

Parece que siempre que elimine \ n y \ r de cualquier encabezado enviado por el usuario, y la conversión de palabra ($ message, 70), debería estar bien. ¿Cuál es el problema con pelar < and > de los nombres de los remitentes? Me interesaría mucho saber a qué tipo de hack te dejan abiertos estos personajes. Cualquier información es muy apreciada. – dqhendricks

Respuesta

1

EDITAR: Esta respuesta puede estar obsoleta. En el momento en que escribí esto, hubo algunos problemas con la biblioteca de SwiftMailer. En este punto, todo funciona bien con el SwiftMailer y se considera la mejor biblioteca con mucho más que ofrecer que PHPMailer.

Le sugiero que utilice phpmailer. Es una de las bibliotecas de correo más estables que he usado. He aquí un ejemplo de código que debe estar trabajando:

include("./phpmailer/class.phpmailer.php"); 
$mail = new PHPMailer(false); // the true param means it will throw exceptions on errors, which we need to catch 
$mail->IsSMTP(); 
$mail->Host = "YourDomainName.com"; 
$mail->SMTPDebug = 2; 
$mail->SMTPAuth = true; 
$mail->SMTPSecure = "tls"; 
$mail->Host = "YourSMTPMailServer.com"; 
$mail->Port = 587; 
$mail->Username = "[email protected]"; 
$mail->Password = "password"; // GMAIL password 
$mail->AddAddress("[email protected]", '<< >> ! " Receiver Name'); 
$mail->SetFrom('[email protected]', '<< >> ! " Sender Name'); 
$mail->Subject = "A testing subject"; 
$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; 
$mail->MsgHTML('This is my <b>html</b> testing email, sent '.time()); 
$mail->Send(); 

Tendrá que configurar esta manera que se conecte a su servidor de correo electrónico, sino que debería estar trabajando. Phpmailer escapa todo lo que he intentado. Lo único que estoy revisando es "[email protected]". Lo hago con este código:

$email = "[email protected]"; 
$email = filter_var(filter_var($email,FILTER_SANITIZE_EMAIL),FILTER_VALIDATE_EMAIL); 

if($email){ 
    echo "This email is valid!"; 
} else { 
    echo "This email is INVALID!"; 
} 

Espero que esto ayude :)

+2

Sí, conozco muy bien a PHPMailer, ya que la utilicé hace un par de años. Simplemente no me gusta cómo funciona esto. ¡Los documentos/tutoriales también están desactualizados en su propio sitio web! Simplemente prefiero Swiftmailer ya que está respaldado por Fabien Potencier/sinfonía. – AlexV

+0

@AlexV Estoy usando SwiftMailer todo el tiempo - hasta ahora no hay problemas en absoluto, aunque de todos modos validar los nombres de usuario/correos electrónicos por adelantado y esos caracteres '<>' se eliminarán por mucho tiempo antes de que lleguen al remitente. – LazyOne

Cuestiones relacionadas