Код IT
← Каталог

Работа с сессиями в PHP — 2. Страница сброса (`/auth/reset.php`)

Фрагмент из «Работа с сессиями в PHP»: 2. Страница сброса (`/auth/reset.php`).

PHP main.php
<?php
require_once '../includes/db.php';

$token = $_GET['token'] ?? '';
if (!$token) {
    die("Недействительная ссылка");
}

// Поиск токена
$stmt = $pdo->prepare("
    SELECT pr.user_id, pr.expires_at, u.email 
    FROM password_resets pr 
    JOIN users u ON pr.user_id = u.id 
    WHERE pr.token = ?
");
$stmt->execute([$token]);
$record = $stmt->fetch();

if (!$record) {
    die("Ссылка недействительна или устарела");
}

$expires = strtotime($record['expires_at']);
if (time() > $expires) {
    die("Срок действия ссылки истёк");
}

if ($_POST) {
    $password = $_POST['password'] ?? '';
    if (strlen($password) < 8) {
        $error = "Пароль должен быть не короче 8 символов";
    } else {
        $hash = password_hash($password, PASSWORD_ARGON2ID);
        $pdo->prepare("UPDATE users SET password_hash = ? WHERE id = ?")
            ->execute([$hash, $record['user_id']]);

        // Удаление использованного токена
        $pdo->prepare("DELETE FROM password_resets WHERE token = ?")->execute([$token]);

        echo "<p>Пароль успешно изменён. <a href='/auth/login.php'>Войти</a></p>";
        exit;
    }
}
?>

<form method="post">
    <h2>Новый пароль</h2>
    <?php if (!empty($error)): ?>
        <p style="color:red"><?= htmlspecialchars($error) ?></p>
    <?php endif; ?>
    <label>Пароль:<br><input type="password" name="password" required></label><br><br>
    <button>Сохранить</button>
</form>
<?php
require_once '../includes/db.php';

$token = $_GET['token'] ?? '';
if (!$token) {
    die("Недействительная ссылка");
}

// Поиск токена
$stmt = $pdo->prepare("
    SELECT pr.user_id, pr.expires_at, u.email 
    FROM password_resets pr 
    JOIN users u ON pr.user_id = u.id 
    WHERE pr.token = ?
");
$stmt->execute([$token]);
$record = $stmt->fetch();

if (!$record) {
    die("Ссылка недействительна или устарела");
}

$expires = strtotime($record['expires_at']);
if (time() > $expires) {
    die("Срок действия ссылки истёк");
}

if ($_POST) {
    $password = $_POST['password'] ?? '';
    if (strlen($password) < 8) {
        $error = "Пароль должен быть не короче 8 символов";
    } else {
        $hash = password_hash($password, PASSWORD_ARGON2ID);
        $pdo->prepare("UPDATE users SET password_hash = ? WHERE id = ?")
            ->execute([$hash, $record['user_id']]);

        // Удаление использованного токена
        $pdo->prepare("DELETE FROM password_resets WHERE token = ?")->execute([$token]);

        echo "<p>Пароль успешно изменён. <a href='/auth/login.php'>Войти</a></p>";
        exit;
    }
}
?>

<form method="post">
    <h2>Новый пароль</h2>
    <?php if (!empty($error)): ?>
        <p style="color:red"><?= htmlspecialchars($error) ?></p>
    <?php endif; ?>
    <label>Пароль:<br><input type="password" name="password" required></label><br><br>
    <button>Сохранить</button>
</form>