Как очистить ввод пользователя в PHP перед отправкой?

У меня есть простой 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"); ?> 

Как я могу санировать вход?

filter_var() переменную post с помощью filter_var() .

Пример здесь . Подобно:

 echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

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

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

 $email = filter_var($email, FILTER_SANITIZE_EMAIL); 

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

 $subject = str_replace(array("\r","\n"),array(" "," "),$subject); 

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

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

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

Вам нужно удалить любые новые строки из ввода, предоставленного пользователями в $ headers, который передается mail () ($ email в вашем случае)! См. « Электронная почта» .

PHP должен позаботиться о дезинфекции $ to и $ subject, но есть версии PHP с ошибками (Affected – это PHP 4 <= 4.4.6 и PHP 5 <= 5.2.1, см. 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 ie: header("Location: http://example.com/anypage/"); // stop the script before it reach or executing the mail function die(); } 

Фильтрация заголовков mail() выше слишком строгая, так как некоторые пользователи могут использовать отфильтрованные строки в своем сообщении без каких-либо намерений захватить вашу электронную почту, поэтому перенаправляйте ее на страницу, которая объясняет, какие строки не являются разрешено в форме или объясняется на странице формы.