Обработка форм в PHP: GET, POST, проверка данных и защита от XSS

Обработка форм в PHP: GET, POST, проверка данных и защита от XSS

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

    Источник

    НЕТ КОММЕНТАРИЕВ

    Оставить комментарий