Очистка пользовательского ввода
Удаляйте опасные символы с помощью htmlspecialchars и filter_input
«Очистка пользовательского ввода» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Очистка и проверка
Проверка определяет, соответствуют ли данные требованиям, и отклоняет их, если это не так.
Очистка удаляет опасные символы или кодирует их, чтобы данные было безопасно использовать.
Нужны обе процедуры: сначала проверяйте данные, затем очищайте их перед выводом.
htmlspecialchars() для вывода в HTML
Всегда экранируйте вывод перед вставкой в HTML, чтобы предотвратить XSS:
<?php
$name = '<script>alert(1)</script>';
// Dangerous — executes script:
// echo $name;
// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert(1)</script>htmlentities() и htmlspecialchars()
Обе функции экранируют HTML, но htmlentities преобразует ВСЕ подходящие символы, а htmlspecialchars — только пять наиболее опасных:
<?php
$str = '<b>café</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8Режимы filter_var FILTER_SANITIZE_*
Режимы очистки filter_var удаляют опасное содержимое:
<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com
$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;strip_tags()
Удаляйте HTML-теги из строки, при необходимости сохраняя разрешённые теги:
<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';
// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)
// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>Очистка данных для SQL
Никогда не очищайте SQL с помощью строковых функций — всегда используйте подготовленные выражения. Правильный подход:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";
// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();addslashes() и подготовленные выражения
addslashes() экранирует обратные косые черты и кавычки, но это НЕ безопасно для SQL. Вместо этого используйте подготовленные выражения PDO. addslashes() всё же может быть полезна для задач, не связанных с SQL, например для создания строк JavaScript:
<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";Очистка имён файлов
Удаляйте опасные символы из имён загруженных файлов:
<?php
function sanitizeFilename(string $name): string {
// Remove path traversal chars and other dangerous ones
$name = basename($name); // strip any path
$name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
$name = preg_replace('/_{2,}/', '_', $name); // collapse underscores
return strtolower($name);
}
echo sanitizeFilename('../../../etc/passwd'); // etc_passwd
echo sanitizeFilename('My Photo (1).JPG'); // my_photo_1_.jpgПриведение идентификаторов к целому числу
Самый простой способ очистить числовые идентификаторы — привести их к типу int, отбрасывающему всё нечисловое содержимое:
<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";
// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');
// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');Контекст вывода имеет значение
Для разных контекстов вывода требуется разное экранирование:
- тело HTML →
htmlspecialchars() - атрибут HTML →
htmlspecialchars(ENT_QUOTES) - JSON/JavaScript →
json_encode() - параметр URL →
urlencode() - SQL → подготовленные выражения
urlencode и rawurlencode
Кодируйте значения для использования в URL:
<?php
$search = 'hello world & PHP';
echo urlencode($search);
// hello+world+%26+PHP (+ for spaces)
echo rawurlencode($search);
// hello%20world%20%26%20PHP (RFC 3986 — use in paths)
$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;Быстрая проверка
Какую функцию следует использовать, чтобы предотвратить внедрение SQL при использовании пользовательских данных в запросе к базе данных?
Повторение: очистка входных данных
Правила очистки:
- вывод HTML →
htmlspecialchars(ENT_QUOTES, 'UTF-8') - SQL → подготовленные выражения, никогда не используйте строковое экранирование
- URL →
urlencode()илиrawurlencode() - имена файлов → удаляйте опасные символы регулярным выражением и используйте
basename() - целочисленные идентификаторы → приводите с помощью
(int) - теги → используйте
strip_tags()для фильтрации с сохранением разрешённых тегов
Часто задаваемые вопросы
Урок «Очистка пользовательского ввода» бесплатный?
Да — полный текст урока «Очистка пользовательского ввода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Очистка пользовательского ввода»?
Удаляйте опасные символы с помощью htmlspecialchars и filter_input Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Очистка пользовательского ввода»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- GET и POST: когда использовать каждый метод
- Чтение данных формы через суперглобальные переменные
- Методы проверки входных данных
- Очистка пользовательского ввода