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

9

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 integrada de saneamiento de cabecera? ¿Qué tendría que hacer uno para protegerse realmente contra este tipo de ataque?

    
pregunta colithium 11.12.2010 - 17:37
fuente

3 respuestas

5

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

enlace

enlace

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

    
respondido por el Fabián Heredia Montiel 12.12.2010 - 16:32
fuente
2

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 de correo () incorporada, será necesario realizar algunos trabajos. En lugar de trabajar con matrices asociativas para encabezados, la función mail () solo acepta una cadena. Por lo tanto, usted (el usuario de mail ()) tendría que desinfectar cada parte del encabezado similar a la anterior a medida que construye la cadena de encabezados.

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

    
respondido por el colithium 11.12.2010 - 18:03
fuente
1

Claramente, nunca puedes confiar en los datos de los usuarios. La solución no es confiar en la limpieza adecuada en la función de encabezado, sino que nunca confíe en los datos DIRTY de sus usuarios.

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

    
respondido por el Chris Dale 11.12.2010 - 17:47
fuente

Lea otras preguntas en las etiquetas