Обработка форм в PHP: GET, POST, проверка данных и защита от XSS
Поисковый запрос, под который подготовлена статья: «обработка форм в PHP POST пример». Если вы только начинаете писать динамические сайты, формы — идеальная тема для практики: через них пользователь отправляет имя, email, комментарии, данные заказа или параметры фильтрации.
GET и POST: что выбрать для формы
В PHP данные формы обычно приходят двумя способами:
- GET — данные попадают в адресную строку. Подходит для поиска, фильтров, пагинации.
- POST — данные отправляются в теле запроса. Подходит для регистрации, комментариев, заявок, отправки сообщений.
Пример GET-формы поиска:
<form method="get" action="search.php">
<input type="text" name="q" placeholder="Что найти?">
<button type="submit">Искать</button>
</form>
После отправки адрес может выглядеть так: search.php?q=php. Для формы обратной связи лучше использовать POST.
Минимальная POST-форма
Создадим файл contact.php. В нём будет и HTML-форма, и PHP-обработка. Для учебного примера это удобно, хотя в больших проектах код обычно разделяют.
<form method="post" action="">
<label>
Имя:
<input type="text" name="name">
</label>
<label>
Email:
<input type="email" name="email">
</label>
<label>
Сообщение:
<textarea name="message"></textarea>
</label>
<button type="submit">Отправить</button>
</form>
Теперь добавим обработку. Важно проверять метод запроса, чтобы код выполнялся только после отправки формы.
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
$message = $_POST['message'] ?? '';
echo 'Форма отправлена';
}
?>
Оператор ?? помогает избежать предупреждения, если поля в запросе нет.
Почему нельзя сразу выводить данные пользователя
Главная ошибка новичков — брать значение из $_POST и сразу выводить его на страницу. Пользователь может отправить не обычный текст, а HTML или JavaScript-код.
<?php
// Плохо: потенциальная XSS-уязвимость
echo $_POST['name'];
?>
Для безопасного вывода используйте htmlspecialchars:
<?php
function e(string $value): string
{
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
echo e($_POST['name'] ?? '');
?>
Эта функция превращает опасные символы вроде <, > и кавычек в безопасные HTML-сущности.
Полный пример: форма с проверкой и ошибками
Ниже практический пример обработки формы в PHP: очищаем пробелы, проверяем обязательные поля, валидируем email и безопасно возвращаем значения в форму.
<?php
function e(string $value): string
{
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
$name = '';
$email = '';
$message = '';
$errors = [];
$success = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');
if ($name === '') {
$errors['name'] = 'Введите имя';
} elseif (mb_strlen($name) < 2) {
$errors['name'] = 'Имя должно быть не короче 2 символов';
}
if ($email === '') {
$errors['email'] = 'Введите email';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Введите корректный email';
}
if ($message === '') {
$errors['message'] = 'Введите сообщение';
} elseif (mb_strlen($message) < 10) {
$errors['message'] = 'Сообщение должно быть не короче 10 символов';
}
if (!$errors) {
// Здесь можно сохранить данные в БД или отправить письмо
$success = true;
$name = '';
$email = '';
$message = '';
}
}
?>
<?php if ($success): ?>
<p>Спасибо! Сообщение отправлено.</p>
<?php endif; ?>
<form method="post" action="">
<p>
<label>Имя</label><br>
<input type="text" name="name" value="<?= e($name) ?>">
<?php if (isset($errors['name'])): ?>
<small><?= e($errors['name']) ?></small>
<?php endif; ?>
</p>
<p>
<label>Email</label><br>
<input type="email" name="email" value="<?= e($email) ?>">
<?php if (isset($errors['email'])): ?>
<small><?= e($errors['email']) ?></small>
<?php endif; ?>
</p>
<p>
<label>Сообщение</label><br>
<textarea name="message"><?= e($message) ?></textarea>
<?php if (isset($errors['message'])): ?>
<small><?= e($errors['message']) ?></small>
<?php endif; ?>
</p>
<button type="submit">Отправить</button>
</form>
Защита от повторной отправки формы
Если пользователь обновит страницу после POST-запроса, браузер может предложить отправить данные повторно. Часто используют паттерн Post/Redirect/Get: после успешной обработки делают редирект.
<?php
if (!$errors) {
// Сохранение данных, отправка письма и т.д.
header('Location: contact.php?success=1');
exit;
}
?>
А сообщение об успехе можно показать по параметру success.
Базовая защита от CSRF
CSRF — атака, при которой пользователя заставляют отправить форму без его намерения. Для защиты добавляют токен. Это уже следующий шаг, но полезно знать его с самого начала.
<?php
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['token'] ?? '';
if (!hash_equals($_SESSION['token'], $token)) {
die('Некорректный токен формы');
}
}
?>
<input type="hidden" name="token" value="<?= e($_SESSION['token']) ?>">
Практические рекомендации
- Всегда проверяйте
$_SERVER['REQUEST_METHOD']. - Используйте
trimдля текстовых полей. - Не доверяйте данным из
$_POST, даже если в HTML стоитrequired. - Для вывода данных применяйте
htmlspecialchars. - После успешной отправки используйте редирект, чтобы избежать повторного POST.
- Для важных действий добавляйте CSRF-токен.
Если хотите не просто разбирать отдельные примеры, а последовательно собрать полноценный сайт с формами, базой данных, авторизацией и практикой безопасности, посмотрите курс «PHP и MySQL с нуля до уверенной разработки» — он хорошо дополняет эту тему.
Итог
Обработка форм в PHP состоит из нескольких обязательных шагов: принять данные, проверить их, безопасно вывести ошибки, выполнить нужное действие и защититься от типичных угроз. Даже простая форма обратной связи должна учитывать XSS, повторную отправку и некорректные значения. Освоив этот шаблон, вы сможете уверенно переходить к регистрации, личным кабинетам и работе с базой данных.
-
Создано 19.08.2026 17:00:47
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.