0Pricing
PHP Academy · Урок

Очистка пользовательского ввода

Удаляйте опасные символы с помощью 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');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() и htmlspecialchars()

Обе функции экранируют HTML, но htmlentities преобразует ВСЕ подходящие символы, а htmlspecialchars — только пять наиболее опасных:

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
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 — локальная установка не требуется.

Все уроки этого курса

  1. GET и POST: когда использовать каждый метод
  2. Чтение данных формы через суперглобальные переменные
  3. Методы проверки входных данных
  4. Очистка пользовательского ввода
← Назад к PHP Academy