Задать вопрос
Baffer
@Baffer
Начинающий веб-разработчик

Не проверяются пароли, в чем проблема?

При регистрации аккаунта идет проверка почты, никнейма и работает проверка на совместимость паролей.
Но почему-то не работает проверка на минимальное число и проверка на пустоту паролей(password & cpassword).
Проверка некнейма работает, почты тоже.
Ошибок никаких нет.

обработчик:
$username = protect($_POST['username']);
$email = protect($_POST['email']);
$password = crypt($_POST['password'], $salt);
$cpassword = crypt($_POST['cpassword'], $salt);
	//email check
	$email_exists = $con->prepare("SELECT * FROM users WHERE email = ?");
	$email_exists->execute(array($email));
	$emailchecker = $email_exists->fetch(PDO::FETCH_ASSOC);
	//user check
	$un_exists = $con->prepare("SELECT * FROM users WHERE username = ?");
	$un_exists->execute(array($username));
	$unchecker = $un_exists->fetch(PDO::FETCH_ASSOC);
	
if(empty($email) or empty($password) or empty($cpassword) or empty($username)) { die(toastr('danger', 'Oops! All fields are required')); }
	elseif (!isValidUsername($username)) { die(toastr('danger', 'Oops! Please enter valid username')); }
	elseif (!emailValid($email)) {  die(toastr('danger', 'Oops! Please enter valid e-mail address')); } 
	elseif ($unchecker > 1) {  die(toastr('danger', 'Oops! Username already taken')); } 
	elseif ($emailchecker > 1) { die(toastr('danger', 'Oops! Email already exists')); }  
	elseif ($password !== $cpassword) { die(toastr('danger', 'Oops! Your passwords does not match')); } 
	elseif (strlen($password) < 6) { die(toastr('danger', 'Oops! Password must be at least 6 characters')); } 
	elseif (strlen($username) < 4) { die(toastr('danger', 'Oops! Username must not be less than 4 characters')); }
	else {
		$date = date('d-m-Y H:i:s');
		$stmt1 = $con->prepare("INSERT users (username, email, password, date) VALUES (:username,:email,:password, :date)");
		$stmt1->bindParam("username",$username);
		$stmt1->bindParam("email",$email);
		$stmt1->bindParam("password",$password);
		$stmt1->bindParam("date",$date);
		$stmt1->execute();


html
<div class="form-group">
                <label class="form-label">Password</label>
                <input type="password" name="password" class="form-control">
              </div>
			  <div class="form-group">
                <label class="form-label">Confirm Password</label>
                <input type="password" name="cpassword" class="form-control">
              </div>
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
SagePtr
@SagePtr
Еда - это святое
$password = crypt($_POST['password'], $salt);
Не изобретайте велосипед и откройте для себя эти функции: password_hash, password_verify
И как уже подсказали выше, нужно проверять длину не хеша пароля, а исходного пароля (у хэша длина в любом случае будет больше 6 символов и проверку он автоматом пройдёт, даже при пустом пароле)
Ответ написан
Комментировать
muzikant777
@muzikant777
PHP/Vue разработчик
1. Что возвращают функции protect() и crypt()?
2. Почитайте про разницу между OR и || в PHP и используйте && и || вместо AND и OR соответственно.
3. Используйте XDebug или, в крайнем случае, var_dump($password), чтобы узнать, что по факту лежит в этих переменных перед проверкой.

$password = crypt($_POST['password'], $salt);
Теперь в $password лежит не пароль, а его (скорее всего) хэш. И затем вы делаете проверку не длины пароля, а его хэша. Не надо так.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gobananas
@gobananas
finishhim.ru
Слишком много ветвлений и они слишком сложные. Сделайте класс, функции, и внутри каждой:
if(strlen($password) < 6){
  $_SESSION['error'] = 'Password must be at least 6 characters';
  return false;
}
if(strlen($username) < 4){
  $_SESSION['error'] = 'Username must not be less than 4 characters';
  return false;
}

И т.д. для каждого условия своя проверка без else, а если все проверки прошло и нигде не вышло - значит всё ок.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы