PNG IHDR x sBIT|d pHYs + tEXtSoftware www.inkscape.org< ,tEXtComment
<?php
require_once "config.php";
session_start();
$token = $_GET['token'] ?? ($_POST['token'] ?? '');
$errors = [];
$success = "";
// Helper: validate token and return user id or false
function getUserByToken($pdo, $token) {
if (!$token) return false;
$stmt = $pdo->prepare("SELECT id, reset_expires FROM users WHERE reset_token = ? LIMIT 1");
$stmt->execute([$token]);
$row = $stmt->fetch();
if (!$row) return false;
if (strtotime($row['reset_expires']) < time()) return false;
return $row['id'];
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['token'] ?? '';
$password = $_POST['password'] ?? '';
$confirm = $_POST['confirm_password'] ?? '';
if (empty($password) || empty($confirm)) {
$errors[] = "Please enter and confirm your new password.";
} elseif ($password !== $confirm) {
$errors[] = "Passwords do not match.";
} elseif (strlen($password) < 8) {
$errors[] = "Password must be at least 8 characters.";
} else {
$userId = getUserByToken($pdo, $token);
if (!$userId) {
$errors[] = "Invalid or expired token.";
} else {
// update password and clear token
$hash = password_hash($password, PASSWORD_DEFAULT);
$upd = $pdo->prepare("UPDATE users SET password_hash = ?, reset_token = NULL, reset_expires = NULL WHERE id = ?");
$upd->execute([$hash, $userId]);
// optional: notify user (email)
// fetch user email
$stmt = $pdo->prepare("SELECT email FROM users WHERE id = ?");
$stmt->execute([$userId]);
$u = $stmt->fetch();
if ($u) {
$to = $u['email'];
$subject = "Your password was changed";
$msg = "Your account password was successfully changed. If you did not perform this action, contact support immediately.";
@mail($to, $subject, $msg, "From: support@yourbank.com\r\nContent-Type: text/plain; charset=UTF-8");
}
$success = "Password reset successful. You can now log in.";
// redirect to login after short delay
header("Location: login.php?reset=1");
exit;
}
}
} else {
// GET - validate token presence; if invalid show message
if (!$token || !getUserByToken($pdo, $token)) {
$errors[] = "Invalid or expired token.";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Reset Password</title>
<style>
:root{--brand-1:#003366;--brand-2:#0055aa;--card-bg:rgba(255,255,255,0.98);--muted:#6b7280;--danger:#d9534f}
*{box-sizing:border-box} body{margin:0;font-family:Inter,Segoe UI,Arial,sans-serif;background:linear-gradient(135deg,var(--brand-1),var(--brand-2));min-height:100vh}
.topbar{position:fixed;top:18px;left:50%;transform:translateX(-50%);width:calc(100% - 36px);max-width:1100px;z-index:40}
.topbar .inner{display:flex;align-items:center;justify-content:space-between;padding:12px 18px;background:linear-gradient(180deg,rgba(255,255,255,0.85),rgba(255,255,255,0.80));border-radius:14px;border-bottom-left-radius:36px;border-bottom-right-radius:36px;box-shadow:0 10px 30px rgba(0,0,0,0.12);backdrop-filter:blur(6px)}
.wrap{width:100%;max-width:480px;margin:140px auto;padding:18px}
.card{background:var(--card-bg);border-radius:18px;padding:28px;box-shadow:0 14px 40px rgba(0,0,0,0.18)}
h2{text-align:center;color:var(--brand-1);margin:0 0 12px}
input{width:100%;padding:12px;border-radius:10px;border:1px solid #d7dbe3;margin-top:10px}
.btn{width:100%;padding:12px;border-radius:10px;border:none;background:linear-gradient(90deg,var(--brand-1),var(--brand-2));color:#fff;font-weight:700;cursor:pointer;margin-top:16px}
.error{background:rgba(217,83,79,0.08);color:var(--danger);padding:10px;border-radius:8px;margin-bottom:12px}
.note{font-size:13px;color:var(--muted);text-align:center;margin-top:10px}
.toggle-pass{position:absolute;right:14px;top:38px;cursor:pointer;color:var(--muted)}
.form-group{position:relative;margin-top:10px}
</style>
</head>
<body>
<div class="topbar">
<div class="inner">
<div style="display:flex;gap:10px;align-items:center">
<div style="height:36px;width:36px;border-radius:8px;background:white;display:grid;place-items:center;color:var(--brand-1);font-weight:700">B</div>
<div><div style="font-weight:700;color:var(--brand-1)">BankName</div><div style="font-size:12px;color:var(--muted)">Reset password</div></div>
</div>
<div style="display:flex;gap:12px;align-items:center"><a href="login.php" style="color:var(--brand-1);text-decoration:none">Sign In</a></div>
</div>
</div>
<div class="wrap">
<div class="card">
<h2>Reset Password</h2>
<?php if(!empty($errors)): ?>
<div class="error"><?php foreach($errors as $e) echo "<div>".htmlspecialchars($e)."</div>"; ?></div>
<?php endif; ?>
<?php if(!$success && empty($errors)): ?>
<form method="post" novalidate>
<input type="hidden" name="token" value="<?=htmlspecialchars($token)?>">
<div class="form-group">
<label style="display:block;font-weight:600;color:var(--brand-1)">New Password</label>
<input id="password" name="password" type="password" placeholder="Create new password" required>
</div>
<div class="form-group">
<label style="display:block;font-weight:600;color:var(--brand-1)">Confirm Password</label>
<input id="confirm_password" name="confirm_password" type="password" placeholder="Confirm new password" required>
</div>
<button class="btn" type="submit">Set New Password</button>
</form>
<div class="note">Password must be at least 8 characters. Keep it secure.</div>
<?php endif; ?>
</div>
</div>
<script>
// password preview toggle (optional)
// small enhancement: show/hide both password fields with Ctrl+P (example) or add a visible toggle if desired
</script>
</body>
</html>
b IDATxytVսϓ22 A@IR:hCiZ[v*E:WũZA ^dQeQ @ !jZ'>gsV仿$|?g)&x-E