Я работаю в системе входа в систему, но у меня есть несколько проблем.
Код написан на чистом php и основан на функциях MySqli и password_verify()
.
Я попробовал свой код на локальном хосте XAMPP.
Итак, мой код работает хорошо, если кто-то попытается войти в систему с неправильным паролем, он покажет error_array Но когда кто-то попробует войти с реальным паролем, он будет:
А) Не повторяйте это 4 строки:
echo $email . "<br>";
echo $password . "<br>";
echo $dbemail . "<br>";
echo $dbpassword; // This is hash, and echoed for testing purposes
B) Не переходить на index.php с header()
Снимок экрана: вход с неверным паролем
![Wrong password is working Logging in with wrong password](https://i.imgur.com/cxJ4tVK.png)
Снимок экрана: вход с реальным паролем
![Real password is not working Logging in with real password](https://i.imgur.com/G09vYnJ.png)
Его 50 строк кода:
<?php
if(isset($_POST['login_button'])) {
$email = strtolower($_POST['log_email']);
$email = filter_var($email, FILTER_SANITIZE_EMAIL); //sanitize email
$_SESSION['log_email'] = $email; //Store email into session variable
$password = $_POST['log_password'];
$check_database_query = mysqli_query($con, "SELECT * FROM users WHERE email='$email'");
$login_row = mysqli_fetch_array($check_database_query);
$dbemail = $login_row['email'];
$dbpassword = $login_row['password'];
//Echo $email, $password, $dbemail, $dbpassword
echo $email . "<br>";
echo $password . "<br>";
echo $dbemail . "<br>";
echo $dbpassword; // This is hash, and echoed for testing purposes
$check_login_query = mysqli_num_rows($check_database_query);
$row = mysqli_fetch_array($check_database_query);
if($check_login_query == 1){
if(password_verify($password, $dbpassword) == true) {
$username = $row['username'];
$user_closed_query = mysqli_query($con, "SELECT * FROM users WHERE email='$email' AND user_closed='yes'");
if(mysqli_num_rows($user_closed_query) == 1) {
$reopen_account = mysqli_query($con, "UPDATE users SET user_closed='no' WHERE email='$email'");
}
$_SESSION['username'] = $username;
//Be logged in after some time
if(isset($_POST['check_box'])) {
setcookie('email', $email, time() + 86400, "/");
setcookie('password', $password, time() + 86400, "/");
}
$check_login_query = "";
// Go to index
echo "redicerting to index...";
header("location: index.php");
exit();
}
else {
array_push($error_array, "<span class='error'>Email or password not working</span><br>");
}
}
else{
array_push($error_array, "<span class='error'>Email or password not working</span><br>");
}
}else{
echo "Login button not POSTed";
}
?>
// Моя форма
<form action="register.php" accept-charset="utf-8" method="POST">
<div id="login_wrapper">
<label for="email">Your e-mail</label><br>
<label id="error_email" style="color: red;"></label>
<input type="text" id="email" name="log_email" value="<?php
if(isset($_SESSION['log_email'])) {
echo $_SESSION['log_email'];
}
?>" required>
<br>
<label for="password">Password</label><br>
<input type="password" id="password" accept-charset="utf-8" name="log_password" required>
<br>
<?php if(in_array("<span class='error'>Email or password not working</span><br>", $error_array)) echo "<span class='error'>Email or password not working</span><br>"; ?>
<input type="submit" name="login_button" value="Login">
<input type="checkbox" name="check_box">Remember me<br>
<br>
<a href="#" id="signup" class="signup">Dont have an accout? Sign Up!</a>
</div>
</form>
Журнал от error.log
:
[Mon Jan 21 15:22:44.064393 2019] [php7:notice] [pid 11540:tid 1960] [client ::1:61860] PHP Notice: Undefined variable: userLoggedIn in C:\\xampp\\htdocs\\drope\\index.php on line 70
[Mon Jan 21 15:43:43.163934 2019] [php7:crit] [pid 11540:tid 1960] [client ::1:63802] PHP Parse error: syntax error, unexpected 'if' (T_IF) in C:\\xampp\\htdocs\\drope\\includes\\form_handlers\\login_handler.php on line 4
Возможно, я плохо написал if()
или у меня есть ошибки в коде, но я не вижу никаких ошибок ..
Также это безопасно? Или как я могу улучшить безопасность? Может быть, не хранить хэш в файлах cookie, но как сохранить учетную запись пользователя после очистки $_SESSION
s?
// Обратите внимание: проблема не в session_start, я уже начал сеанс.