Как санировать ввод пользователя в PHP перед рассылкой? - PullRequest
46 голосов
/ 28 июня 2009

У меня есть простой скрипт почтового PHP, который берет значения из формы, отправленной через POST, и отправляет их мне:

<?php
$to = "me@example.com";

$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 ]

52 голосов
/ 28 июня 2009

Очистить переменную записи с помощью filter_var().

Пример здесь . Как:

echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);   
12 голосов
/ 28 июня 2009

Поскольку вы не создаете SQL-запрос или что-то еще здесь, единственная соответствующая проверка, которую я вижу для этих входных данных, - это проверка электронной почты для $ _POST ["email"] и, возможно, алфавитно-цифровой фильтр для других полей, если Вы действительно хотите ограничить область действия сообщения.

Чтобы отфильтровать адрес электронной почты, просто используйте filter_var :

$email = filter_var($email, FILTER_SANITIZE_EMAIL);

По предложению Фрэнка Фармера вы также можете отфильтровать новые строки в теме письма:

$subject = str_replace(array("\r","\n"),array(" "," "),$subject);
4 голосов
/ 25 августа 2009

Вам необходимо удалить все переводы строк, введенные пользователями в $ headers, которые передаются mail () ($ email в вашем случае)! См. Инъекция по электронной почте .

PHP должен позаботиться о дезинфекции $ to и $ subject, но существуют версии PHP с ошибками (Затронуты PHP 4 <= 4.4.6 и PHP 5 <= 5.2.1, см. <a href="http://www.php-security.org/MOPB/MOPB-34-2007.html" rel="nofollow noreferrer"> MOPB-34- 2007 ).

4 голосов
/ 28 июня 2009

Как уже отмечали другие, filter_var - это здорово. Если он недоступен, добавьте его в свою панель инструментов.

Переменная $headers особенно плоха в плане безопасности. Это может быть добавлено и вызвать поддельные заголовки, которые будут добавлены. Этот пост под названием Email Injection обсуждает это довольно хорошо.

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() и иное ограничение того, что можно вставить.

1 голос
/ 09 июня 2014

Вы можете использовать код из ответа 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() слишком строга, поскольку некоторые пользователи могут использовать отфильтрованные строки в своем сообщении без какого-либо намерения перехватить форму электронной почты, поэтому перенаправьте ее на страницу, объясняющую, какие строки это недопустимо в форме или объясните на странице формы.

...