Как очистить пользовательский ввод в PHP перед отправкой?
У меня есть простой скрипт почтовой программы PHP, который принимает значения из формы, отправленной по почте, и отправляет их мне по почте:
<?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");
?>
Как я могу очистить входные данные?
5 answers
Очистите переменную post с помощью filter_var()
.
Пример здесь. Например:
echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
Поскольку вы здесь не создаете SQL-запрос или что-то в этом роде, единственная подходящая проверка, которую я вижу для этих входных данных, - это проверка электронной почты для $_POST["электронная почта"] и, возможно, буквенно-цифровой фильтр в других полях, если вы действительно хотите ограничить объем того, что может содержать сообщение.
Чтобы отфильтровать адрес электронной почты, просто используйте filter_var:
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
Согласно предложению Фрэнка Фармера, вы также можете отфильтровать новые строки в теме письма:
$subject = str_replace(array("\r","\n"),array(" "," "),$subject);
Как отмечали другие, filter_var
это здорово. Если он недоступен, добавьте его в свой набор инструментов.
Переменная $headers
особенно плоха с точки зрения безопасности. Он может быть добавлен и вызвать добавление поддельных заголовков. Этот пост под названием Инъекция электронной почты довольно хорошо обсуждает это.
filter_var i
это здорово, но еще один способ убедиться, что что-то является адресом электронной почты, а не чем-то плохим, - это использовать функцию isMail()
. Вот один из них:
function isEmail($email) {
return preg_match('|^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$|i', $email);
};
Итак, чтобы использовать это, вы могли бы сделать:
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,
}
С точки зрения ручной проверки, ограничение длины с использованием substr()
, бегущий strip_tags()
и в противном случае ограничивая то, что может быть введено.
Вам необходимо удалить все новые строки из ввода, предоставленного пользователями в заголовках $, которые передаются в mail() (в вашем случае $email)! См. Инъекция электронной почты.
PHP должен позаботиться об очистке $to и $subject, но есть версии PHP с ошибками (затронуты PHP 4 MOPB-34-2007).
Вы можете использовать код из ответа artlung
выше, чтобы подтвердить электронную почту..
Я использую такой код для предотвращения ввода заголовка..
// 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();
}
Приведенная выше фильтрация заголовков mail()
слишком строгая, поскольку некоторые пользователи могут использовать отфильтрованные строки в своем сообщении без какого-либо намерения захватить вашу форму электронной почты, поэтому перенаправьте ее на страницу, на которой объясняется, какие строки не разрешены в форме, или объясните это на странице формы.