Подтверждение адреса почты пользователя
Написал код подтверждения почты пользователя.
Укажите на ошибки и уязвимости в написанном коде (если они есть), а также подскажите, как их можно исправить.
Как таковых ошибок нет, из-за того что только учусь не уверен в правильности написания кода. Хочу услышать мнение опытных в этой сфере людей.
Страница отправки формы на почту:
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
→ Ссылка
- Вы не проверяете
$_GET['token']
подставляя его прямо в sql. - Проверка на
$result['token'] == 0
тоже сломана потому что$query->fetch(PDO::FETCH_ASSOC)
может вернуть false а не массив. - Верификация сломана, потому что email можно верифицировать бесконечное количество раз по ссылке.
- Не рассмотрен вариант в котором функция
mail()
упадёт с ошибкой.