2011-11-09 13 views
20

Claro que al usar MySQL, usa mysqli_real_escape_string() y verifica que el tipo de entrada recibida sea del tipo que esperas (cadena, número, etc.) y puedes estar seguro de que puedes usarla como entrada al mysqli_query() con bastante seguridad ... ¿no?Cadena de escape para usar en mail()

Bueno, las preguntas son:

  • ¿Cuál es la mejor manera de escapar de una cadena que va a ser utilizado en mail()?
  • Si el destinatario del correo electrónico será la dirección de correo electrónico ingresada en un campo de texto, ¿qué cosas debo tener cuidado para evitar inyecciones o explotaciones?

Tengo una muy buena idea de cómo hacerlo, pero estoy investigando las mejores prácticas en este tema para saber si me falta algo, o si hay una manera mejor.


EDIT: La idea de esta pregunta es no tener LA respuesta, pero para hacer una lista exhaustiva de colaboración de todas las cosas para cuidar de correo electrónico cuando se hace con PHP.

+1

No puedo pensar en ataques XSS y las inyecciones de cabecera tal vez; para sanitizar su html (si está usando ese tipo MIME), y asegúrese de que nadie ingrese código personalizado en sus encabezados de correo –

+0

Pele cualquier carácter no imprimible, use codificación US-ASCII. Eliminar \ r \ n caracteres también. Convierte pestañas en espacios. – hakre

+1

Excelente pregunta. Solo desearía no haber agotado mi patético límite de votos por el día. –

Respuesta

12

La idea detrás de la inyección de correo electrónico es que el atacante inyecte el avance de línea (LF) en los encabezados del correo electrónico y, por lo tanto, agrega tantos encabezados como desee. Pelar esos avances de línea lo protegerá de este ataque. Para obtener información detallada, consulte http://www.phpsecure.info/v2/article/MailHeadersInject.en.php

La mejor práctica es confiar en un código bien escrito, frecuentemente actualizado y ampliamente utilizado. Para eso sugeriría usar PEAR_MAIL O Zend_Mail

Si no desea cargar esos módulos o necesita mantener las cosas muy simples. Puede extraer la funcionalidad de filtrado de esos módulos. Aunque recomiendo usarlos y actualizar frecuentemente la biblioteca para que, si aparece un nuevo ataque en el futuro, solo tendrá que actualizar su biblioteca (Pear o Zend) y habrá terminado.

Esta es la función que desinfectar las cabeceras de paquete de correo Pera:

function _sanitizeHeaders(&$headers) 
{ 
    foreach ($headers as $key => $value) { 
     $headers[$key] = 
      preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', 
         null, $value); 
    } 
} 

Zend_Mail usa diferentes filtros para el correo electrónico, nombre y otros campos:

function _filterEmail($email) 
{ 
    $rule = array("\r" => '', 
        "\n" => '', 
        "\t" => '', 
        '"' => '', 
        ',' => '', 
        '<' => '', 
        '>' => '', 
    ); 

    return strtr($email, $rule); 
} 

function _filterName($name) 
{ 
    $rule = array("\r" => '', 
        "\n" => '', 
        "\t" => '', 
        '"' => "'", 
        '<' => '[', 
        '>' => ']', 
    ); 

    return trim(strtr($name, $rule)); 
} 

function _filterOther($data) 
{ 
    $rule = array("\r" => '', 
        "\n" => '', 
        "\t" => '', 
    ); 

    return strtr($data, $rule); 
} 
+0

Creo que hay otro ataque que permiten agregar múltiples mensajes después de cada cuerpo. Sin embargo, no está tan bien documentado. [Suhosin] (http://www.hardened-php.net/suhosin/) protege PHP contra la inyección de encabezado de correo. – hakre

+0

Parece una biblioteca muy interesante. es la primera vez que lo veoPero cómo podemos asegurarnos de que no tenga ningún efecto secundario en el PHP en sí, verifiqué su código fuente que juega con las partes internas de PHP. ¿Se usa en algunos sitios web grandes y confiables? –

+0

Bueno, se envía por defecto con PHP en Debian;) – hakre