Проверка данных является неотъемлемой частью работы с формами. Не только неверно представленные данные могут привести к проблемам с безопасностью, но также могут сломать вашу веб-страницу. Сегодня мы рассмотрим, как удалять недопустимые символы и проверять данные с помощью функции filter_var.
Пример можно увидеть ниже. Пользователь ввел текст «У меня его нет» в качестве домашней страницы. Если эти данные будут введены в базу данных, а затем извлечены в виде ссылки, ссылка будет нарушена.
Большинство людей склонны думать о проверке данных как о чрезвычайно утомительном процессе, когда один из них:
- Сравнивает данные, которые они хотят проверить, с каждой возможной комбинацией, которую они могут придумать.
- Пытается найти золотое регулярное выражение, которое будет соответствовать каждой возможной комбинации.
- Сочетание двух.
Существуют очевидные проблемы с перечисленным выше:
- Это абсолютно отнимает много времени.
- Существует очень высокая вероятность ошибки.
К счастью, начиная с версии 5.2, в PHP появилась замечательная функция filter_var
которая filter_var
от необходимости проверки данных.
filter_var в действии
filter_var
будет выполнять как filter_var
, так и проверку данных. В чем разница между двумя?
- Санитарная обработка удалит любой незаконный символ из данных.
- Валидация определит, находятся ли данные в надлежащей форме.
Примечание: зачем дезинфицировать, а не просто проверять? Возможно, пользователь случайно набрал неправильный символ или, возможно, это было из-за плохого копирования и вставки. Обеззараживая данные, вы берете на себя ответственность за поиск ошибки пользователя.
Как использовать filter_var
Использовать filter_var
невероятно просто. Это просто функция PHP, которая берет два куска данных:
- Переменная, которую вы хотите проверить
- Тип проверки для использования
Например, приведенный ниже код удалит все теги HTML из строки:
1
2
3
|
$string = «<h1>Hello, World!</h1>»;
$new_string = filter_var($string, FILTER_SANITIZE_STRING);
// $new_string is now «Hello, World!»
|
Вот еще один пример — на этот раз сложнее. Приведенный ниже код гарантирует, что значение переменной является действительным IP-адресом:
1
2
3
4
5
6
7
|
$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
. Полный список всех правил, которые вы можете проверить, см. В конце этого руководства.
Пример дезинфекции
Ниже приведен краткий пример очистки ввода из двух полей: поля электронной почты и поля домашней страницы. В этом примере будут удалены все символы, которые не должны встречаться в данных любого типа.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
<?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-адресом.
Чтобы обеспечить правильное форматирование данных, их необходимо проверить.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?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 части информации:
- имя
- Адрес электронной почты
- Домашняя страница
- Сообщение
Мы проведем дезинфекцию и проверку по всем 4 частям данных и отправим электронное письмо, только если они действительны. Если что-то недопустимо или какие-либо поля не заполнены, форма будет представлена пользователю вместе со списком элементов, которые необходимо исправить. Мы также вернем обработанные данные пользователю, если они не знают, что некоторые символы являются недопустимыми.
Шаг 1 — Создание формы
Для первого шага просто создайте элемент формы с 5 полями: для перечисленных выше и кнопкой отправки:
01
02
03
04
05
06
07
08
09
10
11
12
|
<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’];
<br/>
<input type=»submit» name=»Submit» />
</form>
|
Шаг 2 — Определите, была ли отправлена форма
Вы можете проверить, была ли отправлена форма, посмотрев, была ли кнопка отправки «установлена». Поместите следующий код над формой:
1
2
3
|
if (isset($_POST[‘Submit’])) {
}
|
Шаг 3 — Проверка поля имени и сообщения
Поскольку поля имени и сообщения будут очищены и проверены одинаково, мы сделаем их вместе. Сначала проверьте, не заполнено ли одно из полей, выполнив следующие действия:
1
2
3
|
if ($_POST[‘name’] == «»)
if ($_POST[‘message’] == «»)
|
Затем FILTER_SANITIZE_STRING
их с FILTER_SANITIZE_STRING
константы FILTER_SANITIZE_STRING
1
2
3
|
$_POST[‘name’] = filter_var($_POST[‘name’], FILTER_SANITIZE_STRING);
$_POST[‘message’] = filter_var($_POST[‘message’], FILTER_SANITIZE_STRING);
|
Наконец, убедитесь, что два поля все еще не пустые. Это сделано для того, чтобы после удаления всех недопустимых символов у вас не осталось пустого поля:
1
2
3
|
if ($_POST[‘name’] == «»)
if ($_POST[‘message’] == «»)
|
Мы не будем проверять эти два поля просто потому, что не существует абсолютного способа проверки по имени или произвольному сообщению.
Окончательный код выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
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 — Проверка поля электронной почты
Поле электронной почты будет обработано и проверено так же, как это было ранее в руководстве.
Сначала убедитесь, что он не пустой:
1
|
if ($_POST[’email’] != «»)
|
Далее санируйте его:
1
|
$email = filter_var($_POST[’email’], FILTER_SANITIZE_EMAIL);
|
Наконец, подтвердите его как настоящий адрес электронной почты:
1
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
|
Окончательный код выглядит так:
1
2
3
4
5
6
7
8
|
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 — Проверка поля домашней страницы
Опять же, поле домашней страницы будет обработано и проверено так же, как и ранее в этом руководстве.
Во-первых, убедитесь, что оно не пустое:
1
|
if ($_POST[‘homepage’] != «»)
|
Затем очистите его и удалите все недопустимые символы:
1
|
$homepage = filter_var($_POST[‘homepage’], FILTER_SANITIZE_URL)
|
Наконец, проверьте его, чтобы убедиться, что это настоящий URL:
1
|
if (!filter_var($homepage, FILTER_VALIDATE_URL))
|
Окончательный код выглядит так:
1
2
3
4
5
6
7
8
|
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 — Проверьте ошибки и отправьте сообщение
Теперь, когда мы прошли все поля, пришло время сообщить об ошибках или отправить сообщение. Начните с предположения, что не было ошибок:
1
|
if (!$errors) {
|
Затем создайте сообщение электронной почты:
1
2
3
4
5
6
|
$mail_to = ‘[email protected]’;
$subject = ‘New Mail from Form Submission’;
$message = ‘From: ‘ .
$message .= ‘Email: ‘ .
$message .= ‘Homepage: ‘ .
$message .= «Message:\n» .
|
И наконец, отправьте сообщение:
1
|
mail($to, $subject, $message);
|
Однако, если были какие-либо ошибки, сообщите о них и попробуйте снова:
1
|
echo ‘<div style=»color: red»>’ .
|
Завершенный проект выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<?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 = ‘[email protected]’;
$subject = ‘New Mail from Form Submission’;
$message = ‘From: ‘ .
$message .= ‘Email: ‘ .
$message .= ‘Homepage: ‘ .
$message .= «Message:\n» .
mail($to, $subject, $message);
echo «Thank you for your email!<br/><br/>»;
} else {
echo ‘<div style=»color: red»>’ .
}
}
?>
<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’];
<br/>
<input type=»submit» name=»Submit» />
</form>
|
Резюме
Надеюсь, что чтение этого руководства дало вам хорошее представление о новых функциях фильтрации данных в PHP. Есть еще много функций и правил, которые не были рассмотрены, поэтому, если вы хотите узнать больше, см. Раздел « Фильтрация данных » в руководстве по PHP.
- Подпишитесь на RSS-канал NETTUTS, чтобы узнать о ежедневных новостях и статьях о веб-разработке.