Подтверждение адреса почты пользователя

Написал код подтверждения почты пользователя.

Укажите на ошибки и уязвимости в написанном коде (если они есть), а также подскажите, как их можно исправить.

Как таковых ошибок нет, из-за того что только учусь не уверен в правильности написания кода. Хочу услышать мнение опытных в этой сфере людей.

Страница отправки формы на почту:

    require "bd.php";
    $user_email = trim(filter_var($_POST['email'], FILTER_SANITIZE_EMAIL));
    $token = bin2hex(random_bytes(32));
    $sql = 'INSERT INTO email_verification(email, token) VALUES(?, ?)';
    $query = $pdo->prepare($sql);
    $query->execute([$user_email, $token]);
    $link = "http://p754441.ihc.xyz/lib/check_mail.php?token=$token";
    mail($user_email, 'Подтвердите ваш email-адрес', "Пожалуйста, перейдите по ссылке, чтобы подтвердить ваш email-адрес: $link");

Страница подтверждения почты:

require "bd.php";
$token = $_GET['token'];
$sql = 'SELECT * FROM email_verification WHERE token = ?';
$query = $pdo->prepare($sql);
$query->execute([$token]);
$result = $query->fetch(PDO::FETCH_ASSOC);
?>

if ($token == 0){
    exit("<meta http-equiv='refresh' content='0; url= /index.php'>");
}
if ($result['token'] == 0){
    exit("<meta http-equiv='refresh' content='0; url= /index.php'>");
}
if ($token == $result['token']){
    $verification = '1';
    $sql = 'UPDATE email_verification SET verification=? WHERE token = ?';
    $query= $pdo->prepare($sql);
    $query->execute([$verification, $token]);
    echo "Почта проверена";
}

Ответы (1 шт):

Автор решения: lopar
  1. Вы не проверяете $_GET['token'] подставляя его прямо в sql.
  2. Проверка на $result['token'] == 0 тоже сломана потому что $query->fetch(PDO::FETCH_ASSOC) может вернуть false а не массив.
  3. Верификация сломана, потому что email можно верифицировать бесконечное количество раз по ссылке.
  4. Не рассмотрен вариант в котором функция mail() упадёт с ошибкой.
→ Ссылка