Статьи

Обеззараживать и проверять данные с помощью фильтров PHP

Проверка данных является неотъемлемой частью работы с формами. Не только неверно представленные данные могут привести к проблемам с безопасностью, но также могут сломать вашу веб-страницу. Сегодня мы рассмотрим, как удалять недопустимые символы и проверять данные с помощью функции filter_var.


Пример можно увидеть ниже. Пользователь ввел текст «У меня его нет» в качестве домашней страницы. Если эти данные будут введены в базу данных, а затем извлечены в виде ссылки, ссылка будет нарушена.

Большинство людей склонны думать о проверке данных как о чрезвычайно утомительном процессе, когда один из них:

  • Сравнивает данные, которые они хотят проверить, с каждой возможной комбинацией, которую они могут придумать.
  • Пытается найти золотое регулярное выражение, которое будет соответствовать каждой возможной комбинации.
  • Сочетание двух.

Существуют очевидные проблемы с перечисленным выше:

  • Это абсолютно отнимает много времени.
  • Существует очень высокая вероятность ошибки.

К счастью, начиная с версии 5.2, в PHP появилась замечательная функция 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 частям данных и отправим электронное письмо, только если они действительны. Если что-то недопустимо или какие-либо поля не заполнены, форма будет представлена ​​пользователю вместе со списком элементов, которые необходимо исправить. Мы также вернем обработанные данные пользователю, если они не знают, что некоторые символы являются недопустимыми.

Для первого шага просто создайте элемент формы с 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>

Вы можете проверить, была ли отправлена ​​форма, посмотрев, была ли кнопка отправки «установлена». Поместите следующий код над формой:

1
2
3
if (isset($_POST[‘Submit’])) {
 
}

Поскольку поля имени и сообщения будут очищены и проверены одинаково, мы сделаем их вместе. Сначала проверьте, не заполнено ли одно из полей, выполнив следующие действия:

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/>’;
}

Поле электронной почты будет обработано и проверено так же, как это было ранее в руководстве.

Сначала убедитесь, что он не пустой:

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/>’;
}

Опять же, поле домашней страницы будет обработано и проверено так же, как и ранее в этом руководстве.

Во-первых, убедитесь, что оно не пустое:

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/>’;
}

Теперь, когда мы прошли все поля, пришло время сообщить об ошибках или отправить сообщение. Начните с предположения, что не было ошибок:

1
if (!$errors) {

Затем создайте сообщение электронной почты:

1
2
3
4
5
6
$mail_to = ‘me@somewhere.com’;
$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 = ‘me@somewhere.com’;
            $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.