Безопасность данных

Последнее обновление: 15.03.2021

Большое значение в PHP имеет организация безопасности данных. Рассмотрим несколько простых механизмов, которые могут повысить безопасность нашего веб-сайта.

Но вначале возьмем форму из прошлой темы:

<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<?php
$name = "не определено";
$age = "не определен";
if(isset($_POST["name"])){
 
    $name = $_POST["name"];
}
if(isset($_POST["age"])){
 
    $age = $_POST["age"];
}
echo "Имя: $name <br> Возраст: $age";
?>
<h3>Форма ввода данных</h3>
<form method="POST">
    <p>Имя: <input type="text" name="name" /></p>
    <p>Возраст: <input type="number" name="age" /></p>
    <input type="submit" value="Отправить">
</form>
</body>
</html>

И попробуем ввести в нее некоторые данные. Например, введем в поле для имени "<script>alert(hi);</script>":

Безопасность в PHP

После отправки данных в html разметку будет внедрен код javascript, который выводит окно с сообщением.

Это относительно простой и безвредный скрипт. Однако внедряемый код может быть более вредоносным. И чтобы избежать подобных проблем с безопасностью, рекомендуется применять функцию htmlentities(). В качестве параметра она принимает значение, которое надо экранировать:

$name = "не определено";
$age = "не определен";
if(isset($_POST["name"])){
 
    $name = htmlentities($_POST["name"]);
}
if(isset($_POST["age"])){
 
    $age = htmlentities($_POST["age"]);
}
echo "Имя: $name <br> Возраст: $age";

И даже после ввода кода html или javascript все теги будут экранированы, и мы получим следующий вывод:

Функция htmlentities в PHP

Еще одна специальная функция - htmlspecialchars() похожа по действию на htmlentities:

$name = "не определено";
$age = "не определен";
if(isset($_POST["name"])){
 
    $name = htmlspecialchars($_POST["name"]);
}
if(isset($_POST["age"])){
 
    $age = htmlspecialchars($_POST["age"]);
}
echo "Имя: $name <br> Возраст: $age";

Еще одна функция - функция strip_tags() позволяет полностью исключить теги html:

$name = "не определено";
$age = "не определен";
if(isset($_POST["name"])){
 
    strip_tags($_POST["name"]);
}
if(isset($_POST["age"])){
 
    strip_tags($_POST["age"]);
}
echo "Имя: $name <br> Возраст: $age";

Результатом ее работы при том же вводе будет следующий вывод:

Функция strip_tags в PHP
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850