verificacion - validar un correo electronico php
¿Cómo desinfectar la entrada del usuario en PHP antes de enviarlo por correo? (5)
Como no está creando una consulta SQL ni nada aquí, la única validación relevante que puedo ver para esas entradas es una validación de correo electrónico para $ _POST ["email"], y tal vez un filtro alfanumérico en los otros campos si realmente desea para limitar el alcance de lo que el mensaje puede contener.
Para filtrar la dirección de correo electrónico, simplemente use filter_var :
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
Según la sugerencia de Frank Farmer, también puede filtrar las nuevas líneas en el asunto del correo electrónico:
$subject = str_replace(array("/r","/n"),array(" "," "),$subject);
Tengo un simple script de correo de PHP que toma los valores de un formulario enviado a través de POST y me los envía:
<?php
$to = "[email protected]";
$name = $_POST[''name''];
$message = $_POST[''message''];
$email = $_POST[''email''];
$body = "Person $name submitted a message: $message";
$subject = "A message has been submitted";
$headers = ''From: '' . $email;
mail($to, $subject, $body, $headers);
header("Location: http://example.com/thanks");
?>
¿Cómo puedo desinfectar la entrada?
Como otros han notado, filter_var
es genial. Si no está disponible, agréguela a su Toolchest.
La variable $headers
es particularmente mala en cuanto a seguridad. Se puede agregar y hacer que se agreguen encabezados falsificados. Esta publicación llamada Email Injection lo discute bastante bien.
filter_var i
es genial, pero otra manera de asegurar que algo sea una dirección de correo electrónico y no algo malo es usar una función isMail()
. Aquí hay uno:
function isEmail($email) {
return preg_match(''|^[_a-z0-9-]+(/.[_a-z0-9-]+)*@[a-z0-9-]+(/.[a-z0-9-]{2,})+$|i'', $email);
};
Entonces, para usar esto, podrías hacer:
if (isset($_POST[''email'']) && isEmail($_POST[''email''])) {
$email = $_POST[''email''] ;
} else {
// you could halt execution here, set $email to a default email address
// display an error, redirect, or some combination here,
}
En términos de validación manual, limitando la longitud usando substr()
, ejecutando strip_tags()
y limitando lo que se puede poner.
Debe eliminar las nuevas líneas de las entradas proporcionadas por los usuarios en $ encabezados, que se pasan a mail () ($ correo electrónico en su caso). Ver inyección de correo electrónico .
PHP debería ocuparse de desinfectar $ to y $ subject, pero existen versiones de PHP con errores (los afectados son PHP 4 <= 4.4.6 y PHP 5 <= 5.2.1, ver MOPB-34-2007 ).
Desinfecte la variable de publicación con filter_var()
.
Ejemplo aquí . Me gusta:
echo filter_var($_POST[''email''], FILTER_SANITIZE_EMAIL);
Puede usar el código de la artlung
de artlung
arriba para validar el correo electrónico.
Utilizo este tipo de código para evitar la inyección de encabezado.
// define some mail() header''s parts and commonly used spam code to filter using preg_match
$match = "/(from/:|to/:|bcc/:|cc/:|content/-type/:|mime/-version/:|subject/:|x/-mailer/:|reply/-to/:|/%0a|/%0b)/i";
// check if any field''s value containing the one or more of the code above
if (preg_match($match, $name) || preg_match( $match, $message) || preg_match( $match, $email)) {
// I use ajax, so I call the string below and send it to js file to check whether the email is failed to send or not
echo "failed";
// If you are not using ajax, then you can redirect it with php header function i.e: header("Location: http://example.com/anypage/");
// stop the script before it reach or executing the mail function
die();
}
El filtrado de encabezado de mail()
anterior es demasiado estricto, ya que algunos usuarios pueden estar usando las cadenas filtradas en su mensaje sin intención de secuestrar su formulario de correo electrónico, así que rediríjalo a una página que explique qué tipo de cadenas no son permitido en el formulario o explíquelo en su página de formulario.