Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)
Валидация данных является неотъемлемой частью работы с формами. Не только недопустимые отправленные данные могут привести к проблемам безопасности, но также могут сломать вашу веб-страницу. Сегодня мы рассмотрим, как удалить недопустимые символы и проверить данные с помощью функции «filter_var».
Посмотрите приведенный ниже пример . Пользователь ввел текст "I don't have one" в качестве домашней страницы. Если эти данные должны были быть введены в базу данных, а затем получены в качестве ссылки, ссылка будет нарушена.



Большинство людей склонны думать о валидации данных как о чрезвычайно утомительном процессе, где нужно:
- Сравнивать данные, которые они хотят проверять, с любой возможной комбинацией, которую они могут придумать.
- Пытаться найти золотое регулярное выражение, которое будет соответствовать любой возможной комбинации.
- Сочетание этих двух пунктов.
Есть очевидные проблемы с перечисленным выше:
- Это занимает много времени.
- Существует очень высокая вероятность ошибки.
К счастью, начиная с версии 5.2, PHP включил отличную функцию, называемую filter_var
, которая устраняет трудности проверки данных.
filter_var в действии
filter_var
будет делать, оба действия, и санитизировать и проверять данные. В чем разница между ними?
- Санитизация удалит из данных какой-либо некорректный символ.
- Проверка будет определять, находятся ли данные в надлежащей форме.
Примечание: зачем санитизировать, а не просто проверять? Возможно, пользователь случайно набрал неправильный символ или, возможно, ошибка была из-за плохих копирования и вставки. Очищая данные, вы берете на себя ответственность за ошибку пользователя.
Как использовать filter_var
Использование filter_var
невероятно просто. Это просто функция PHP, которая принимает две части данных:
- Переменную, которую вы хотите проверить
- Тип проверки для использования
Например, приведенный ниже код удалит все теги HTML из строки:
$string = "<h1>Hello, World!</h1>"; $new_string = filter_var($string, FILTER_SANITIZE_STRING); // $new_string is now "Hello, World!"
Вот еще один пример - на этот раз сложнее. Приведенный ниже код гарантирует, что значение переменной является допустимым IP-адресом:
$ip = "127.0.0.1"; $valid_ip = filter_var($ip, FILTER_VALIDATE_IP); // $valid_ip is TRUE $ip = "127.0.1.1.1.1"; $valid_ip = filter_var($ip, FILTER_VALIDATE_IP); // $valid_ip is FALSE
Вот так просто использовать filter_var
. Полный список всех правил, которые вы можете использовать, смотрите в конце этого руководства.
Пример санитизации
Ниже приведен краткий пример очищения входных данных из двух полей: поля электронной почты и поля домашней страницы. В этом примере будут удалены любые символы, которые не должны встречаться в любом типе данных.
<?php if (isset($_POST['email'])) { echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); echo "<br/><br/>"; } if (isset($_POST['homepage'])) { echo filter_var($_POST['homepage'], FILTER_SANITIZE_URL); echo "<br/><br/>"; } ?> <form name="form1" method="post" action="form-sanitize.php"> Email Address: <br/> <input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> Home Page: <br/> <input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/> <br/> <input type="submit" /> </form>



Используя константы FILTER_SANITIZE_EMAIL
и FILTER_SANITIZE_URL
, определенные PHP, функция знает, какие символы являются некорректными.
Пример валидации
Просто потому, что данные очищены, не гарантируется, что они правильно отформатированы. В приведенном ниже примере данные не нуждались в санитизации, но очевидно, что вход пользователя не является адресом электронной почты или URL-адресом.



Чтобы обеспечить правильное форматирование данных, их необходимо проверить.
<?php if (isset($_POST['email'])) { $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); if (filter_var($email, FILTER_VALIDATE_EMAIL)) { echo "$email is a valid email address.<br/><br/>"; } else { echo "$email is <strong>NOT</strong> a valid email address.<br/><br/>"; } } if (isset($_POST['homepage'])) { $homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL); if (filter_var($homepage, FILTER_VALIDATE_URL)) { echo "$homepage is a valid URL.<br/><br/>"; } else { echo "$homepage is <strong>NOT</strong> a valid URL.<br/><br/>"; } } ?> <form name="form1" method="post" action="form-validate.php"> Email Address: <br/> <input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> Home Page: <br/> <input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/> <br/> <input type="submit" /> </form>



Теперь, когда данные были проверены, вы можете быть уверены, что представленная информация - именно то, что вы ищете.
Все вместе: Форма отправки электронной почты
Теперь, когда данные очистки и проверки были рассмотрены, мы будем использовать эти навыки для быстрой отправки электронной почты. Это ни в коем случае не будет иметь качества готового продукта - например, никакая форма не должна требовать домашней страницы, но она будет работать идеально для этого урока. Форма будет содержать 4 части информации:
- Name
- Email Address
- Home Page
- Message
Мы будем очищать и проверять все 4 части данных и отправлять их по электронной почте, только если все они корректны. Если что-либо не прошло проверку или какие-либо поля пустые, форма будет представлена пользователю вместе со списком элементов для исправления. Мы также вернем обработанные данные пользователю, если он не знает, что определенные символы являются неразрешенными.
Шаг 1 - Создание формы
Для первого шага просто создайте элемент формы с 5 полями: для перечисленных выше и кнопки отправки:
<form name="form1" method="post" action="form-email.php"> Name: <br/> <input type="text" name="name" value="<?php echo $_POST['name']; ?>" size="50" /><br/><br/> Email Address: <br/> <input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> Home Page: <br/> <input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/><br/> Message: <br/> <textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea> <br/> <input type="submit" name="Submit" /> </form>
Шаг 2 - Определение, была ли форма передана
Вы можете проверить, была ли отправлена форма, если была установлена кнопка «Submit». Поместите следующий код над вашей формой:
if (isset($_POST['Submit'])) { }
Шаг 3 - Проверка поля имени и сообщения
Поскольку поля имени и сообщения будут очищены и проверены одинаково, мы проверем их вместе. Во-первых, проверьте, не пусто ли поле, выполнив следующие действия:
if ($_POST['name'] == "") if ($_POST['message'] == "")
Затем очистите их, используя константу FILTER_SANITIZE_STRING
$_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING); $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);
Наконец, убедитесь, что оба поля по-прежнему не пустые. Это необходимо для того, чтобы после удаления всех незаконных символов у вас не осталось пустого поля:
if ($_POST['name'] == "") if ($_POST['message'] == "")
Мы не будем делать валидацию этих двух полей просто потому, что нет абсолютного способа проверки имени или произвольного сообщения.
Окончательный код выглядит следующим образом:
if ($_POST['name'] != "") { $_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING); if ($_POST['name'] == "") { $errors .= 'Please enter a valid name.<br/><br/>'; } } else { $errors .= 'Please enter your name.<br/>'; } if ($_POST['message'] != "") { $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); if ($_POST['message'] == "") { $errors .= 'Please enter a message to send.<br/>'; } } else { $errors .= 'Please enter a message to send.<br/>'; }
Шаг 4 - Проверка поля электронной почты
Поле электронной почты будет очищено и проверено так же, как это было ранее в уроке.
Во-первых, убедитесь, что оно не пустое:
if ($_POST['email'] != "")
Далее, очистите его:
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
Наконец, подтвердите его как истинный адрес электронной почты:
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
Окончательный код выглядит следующим образом:
if ($_POST['email'] != "") { $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors .= "$email is <strong>NOT</strong> a valid email address.<br/><br/>"; } } else { $errors .= 'Please enter your email address.<br/>'; }
Шаг 5 - Проверка поля домашней страницы
Опять же, поле домашней страницы будет очищено и проверено так же, как ранее в уроке.
Во-первых, убедитесь, что оно не пустое:
if ($_POST['homepage'] != "")
Затем, санитизируйте его и удалите любые неразрешенные символы:
$homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL)
Наконец, проверьте его, чтобы убедиться, что это истинный URL:
if (!filter_var($homepage, FILTER_VALIDATE_URL))
Окончательный код выглядит следующим образом:
if ($_POST['homepage'] != "") { $homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL); if (!filter_var($homepage, FILTER_VALIDATE_URL)) { $errors .= "$homepage is <strong>NOT</strong> a valid URL.<br/><br/>"; } } else { $errors .= 'Please enter your home page.<br/>'; }
Шаг 6 - Проверка на наличие ошибок и отправка сообщения
Теперь, когда мы проверили все поля, пришло время либо сообщить об ошибках, либо отправить сообщение. Начнем с варианта, когда ошибок не было:
if (!$errors) {
Затем создаем сообщение электронной почты:
$mail_to = 'me@somewhere.com'; $subject = 'New Mail from Form Submission'; $message = 'From: ' . $_POST['name'] . "\n"; $message .= 'Email: ' . $_POST['email'] . "\n"; $message .= 'Homepage: ' . $_POST['homepage'] . "\n"; $message .= "Message:\n" . $_POST['message'] . "\n\n";
И, наконец, отправляем сообщение:
mail($to, $subject, $message);
Однако, если были ошибки, сообщите об этом и попросите пользователя повторить попытку:
echo '<div style="color: red">' . $errors . '<br/></div>';
Завершенный проект выглядит следующим образом:
<?php if (isset($_POST['Submit'])) { if ($_POST['name'] != "") { $_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING); if ($_POST['name'] == "") { $errors .= 'Please enter a valid name.<br/><br/>'; } } else { $errors .= 'Please enter your name.<br/>'; } if ($_POST['email'] != "") { $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors .= "$email is <strong>NOT</strong> a valid email address.<br/><br/>"; } } else { $errors .= 'Please enter your email address.<br/>'; } if ($_POST['homepage'] != "") { $homepage = filter_var($_POST['homepage'], FILTER_SANITIZE_URL); if (!filter_var($homepage, FILTER_VALIDATE_URL)) { $errors .= "$homepage is <strong>NOT</strong> a valid URL.<br/><br/>"; } } else { $errors .= 'Please enter your home page.<br/>'; } if ($_POST['message'] != "") { $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING); if ($_POST['message'] == "") { $errors .= 'Please enter a message to send.<br/>'; } } else { $errors .= 'Please enter a message to send.<br/>'; } if (!$errors) { $mail_to = 'me@somewhere.com'; $subject = 'New Mail from Form Submission'; $message = 'From: ' . $_POST['name'] . "\n"; $message .= 'Email: ' . $_POST['email'] . "\n"; $message .= 'Homepage: ' . $_POST['homepage'] . "\n"; $message .= "Message:\n" . $_POST['message'] . "\n\n"; mail($to, $subject, $message); echo "Thank you for your email!<br/><br/>"; } else { echo '<div style="color: red">' . $errors . '<br/></div>'; } } ?> <form name="form1" method="post" action="form-email.php"> Name: <br/> <input type="text" name="name" value="<?php echo $_POST['name']; ?>" size="50" /><br/><br/> Email Address: <br/> <input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="50"/> <br/><br/> Home Page: <br/> <input type="text" name="homepage" value="<?php echo $_POST['homepage']; ?>" size="50" /> <br/><br/> Message: <br/> <textarea name="message" rows="5" cols="50"><?php echo $_POST['message']; ?></textarea> <br/> <input type="submit" name="Submit" /> </form>
Итоги
Надеюсь, что чтение этого руководства дало вам хорошее представление о новых функциях фильтрации данных PHP. Существует еще много функций и правил, которые не были охвачены, поэтому, если вас интересует больше, обратитесь к разделу Фильтрация данных в руководстве по PHP.
- Подпишитесь на RSS-канал NETTUTS для ежедневных веб-разработок и статей.