it-swarm-es.com

PHP mail () Prevención de inyección de encabezado

Este sitio explica muy bien el problema. Esencialmente, casi todos los ejemplos de php mail () que se dan son vulnerables a los ataques de inyección de encabezado. El sitio al que se hace referencia proporciona una solución de saneamiento de expresiones regulares, pero no estoy satisfecho con ella. ¿Hay una función de saneamiento del cabezal incorporada? ¿Qué tendría que hacer uno para protegerse realmente contra este tipo de ataque?

9
colithium

De hecho PHP incluye una función para verificar la validez de una dirección proporcionada.

http://php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/filter.filters.validate.php

Ejemplo: filter_var ($ _ POST ['from'], FILTER_VALIDATE_EMAIL)? enviar (): morir ("Me asesinaste. D:");

Así es como pear lo hace en su paquete de correo:

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

Obviamente, para que este método se adapte para que funcione con la función integrada mail (), será necesario realizar algo de trabajo. En lugar de trabajar con matrices asociativas para encabezados, la función mail () solo acepta una cadena. Entonces usted (el usuario de mail ()) tendría que desinfectar cada parte del encabezado de manera similar a la anterior a medida que crea la cadena de encabezados.

Me gustaría escuchar en los comentarios si esto cubre todas las amenazas de inyección (de aquellas que tienen más experiencia en problemas como este).

2
colithium

Claramente, nunca se puede confiar en los datos de los usuarios. La solución no es confiar en una desinfección conveniente en la función de encabezado, sino que nunca confíe en los datos SUCIOS de sus usuarios.

No importa cuándo ni cómo, pero si sus datos provienen del exterior, debe limpiarlos. En este ejemplo, un simple/escaparía del carácter/n, y el ataque no funcionaría.

1
Chris Dale