PHP Secure E-mails


En el script PHP de correo electrónico de la sección anterior, existe una vulnerabilidad.


Inyección de PHP E-mail

Primero, veamos el código PHP del capítulo anterior:

<html>
<head>
<meta charset="utf-8">
<title>Ejemplo(example.com)</title>
</head>
<body>

<?php
if (isset($_REQUEST['email'])) { // 如果接收到邮箱参数则发送邮件
    // 发送邮件
    $email = $_REQUEST['email'] ;
    $subject = $_REQUEST['subject'] ;
    $message = $_REQUEST['message'] ;
    mail("[email protected]", $subject,
    $message, "From:" . $email);
    echo "邮件发送成功";
} else { // 如果没有邮箱参数则显示表单
    echo "<form method='post' action='mailform.php'>
    Email: <input name='email' type='text'><br>
    Subject: <input name='subject' type='text'><br>
    Message:<br>
    <textarea name='message' rows='15' cols='40'>
    </textarea><br>
    <input type='submit'>
    </form>";
}
?>

</body>
</html>

El problema con el código anterior es que un usuario no autorizado puede insertar datos en los encabezados del correo a través del formulario de entrada.

¿Qué sucede si el usuario agrega el siguiente texto al correo electrónico en el campo de entrada del formulario?

[email protected]%0ACc:[email protected]
%0ABcc:[email protected],[email protected],
[email protected],[email protected]
%0ABTo:[email protected]

Como siempre, la función mail() coloca el texto anterior en los encabezados del correo, por lo que ahora los encabezados tienen campos adicionales Cc:, Bcc: y To:. Cuando el usuario hace clic en el botón de enviar, ¡este correo electrónico se enviará a todas las direcciones anteriores!


PHP Prevención de inyección de E-mail

La mejor manera de prevenir la inyección de correo electrónico es validar la entrada.

El siguiente código es similar al del capítulo anterior, pero aquí hemos agregado un programa de validación de entrada que detecta el campo email del formulario:

<html>
<head>
<meta charset="utf-8">
<title>Ejemplo(example.com)</title>
</head>
<body>
<?php
function spamcheck($field)
{
    // filter_var() 过滤 e-mail
    // 使用 FILTER_SANITIZE_EMAIL
    $field=filter_var($field, FILTER_SANITIZE_EMAIL);

    //filter_var() 过滤 e-mail
    // 使用 FILTER_VALIDATE_EMAIL
    if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

if (isset($_REQUEST['email']))
{
    // 如果接收到邮箱参数则发送邮件

    // 判断邮箱是否合法
    $mailcheck = spamcheck($_REQUEST['email']);
    if ($mailcheck==FALSE)
    {
        echo "非法输入";
    }
    else
    {    
        // 发送邮件
        $email = $_REQUEST['email'] ;
        $subject = $_REQUEST['subject'] ;
        $message = $_REQUEST['message'] ;
        mail("[email protected]", "Subject: $subject",
        $message, "From: $email" );
        echo "Thank you for using our mail form";
    }
}
else
{ 
    // 如果没有邮箱参数则显示表单
    echo "<form method='post' action='mailform.php'>
    Email: <input name='email' type='text'><br>
    Subject: <input name='subject' type='text'><br>
    Message:<br>
    <textarea name='message' rows='15' cols='40'>
    </textarea><br>
    <input type='submit'>
    </form>";
}
?>

</body>
</html>

En el código anterior, usamos filtros de PHP para validar la entrada:

  • El filtro FILTER_SANITIZE_EMAIL elimina los caracteres ilegales del correo electrónico de una cadena.
  • El filtro FILTER_VALIDATE_EMAIL valida el valor de una dirección de correo electrónico.

Puede, en nuestroPHP Filterleer más sobre los filtros.

Otras extensiones