#php #mysql
#php #MySQL
Вопрос:
Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь войти на свой веб-сайт PHP, форма входа часто не переводит пользователя на страницу участников после входа в систему. Вход в систему не работает с первого раза. Затем, после повторного использования тех же учетных данных для входа, это работает. Это происходит не всегда. Иногда это работает с первого раза без проблем, в других случаях вам нужно войти во второй раз, чтобы это сработало.
<?php
session_start();
require "connection.php";
include "navigation.php";
if(isset($_SESSION['origURL'])){
$url = $_SESSION['origURL'];
}
$max_time = (time() - 60*60);
$client = $_SERVER['REMOTE_ADDR'];
$check = mysqli_query($conn,"SELECT * FROM login_attempts WHERE ip_address = '$client' AND time >='$max_time'");
$checkrow = mysqli_fetch_array($check);
$tries = mysqli_num_rows($check);
if($tries == 3){
header("Location: robot.php");
exit;
}
if ( isset($_COOKIE['userid']) amp;amp; (isset($_COOKIE['username']) amp;amp; ($_COOKIE['userid'] !== ""))){
header("Location: member.php");
exit;
}
$error = false;
if(isset($_GET['activated'])){
$error_msg = "<div style='border: 2px solid green;margin-bottom:5px; padding:7px;'>Token authenticated successfully - your account is now activated.</div>";
}
if(isset($_GET['updated'])){
$error_msg = "<div style='border: 2px solid orange;margin-bottom:5px; padding:7px;'>Your details have been updated. Please login again for these changes to take effect.</div>";
}
if(isset($_POST['submit'])){
$var_password = trim($_POST['password']);
$var_password = strip_tags($var_password);
$var_password = htmlspecialchars($var_password);
$var_username = trim($_POST['username']);
$var_username = strip_tags($var_username);
$var_username = htmlspecialchars($var_username);
if (empty($var_username)){
$error = true;
$error = 1;
}else{
if (empty($var_password)){
$error = true;
$error = 1;
}
}
if (!$error){
$var_password = hash('sha256', $var_password);
$query = mysqli_query($conn,"SELECT username, password, userid, acc_active FROM users WHERE username = '$var_username'");
$row = mysqli_fetch_array($query);
$count = mysqli_num_rows($query);
$userid = $row['userid'];
$stat = $row['acc_active'];
if ($count == 1 amp;amp; $row['username']==$var_username amp;amp; $row['password']==$var_password) {
if($stat == "active" || $stat == "inactive"){
$_COOKIE['username'] = $row['username'];
$_COOKIE['userid'] = $row['userid'];
$userid = $_COOKIE['userid'];
setcookie("username", $var_username, time() 30*24*60*60);
setcookie("userid", $userid, time() 30*24*60*60);
$stmt = $conn->prepare("DELETE FROM login_attempts WHERE ip_address=?");
$stmt->bind_param("s",$client);
$stmt->execute();
$stmt->close();
if(isset($url)){
header("Location: $url");
}else{
header("Location: member.php");
}
}else{
if($stat == "disabled"){
$error_msg = "<div style='border: 2px solid red;margin-bottom:5px; padding:7px;'>Account does not exist, or it is banned/disabled.</div>";
}
if($stat == "notverified"){
$error_msg = "<div style='border: 2px solid red;margin-bottom:5px; padding:7px;'>Account is inactive. Please check your inbox / spam for activation token.</div>";
}
}
} else {
$error = 1;
}
}else{
$error = 1;
}
if($error == 1){
$when = time();
$stmt = $conn->prepare("INSERT INTO login_attempts(ip_address, username, time) VALUES(?,?,?)");
$stmt->bind_param("sss", $client, $var_username, $when);
$stmt->execute();
$stmt->close();
$tries = $tries 1;
$error_msg = "<div style='border: 2px solid orange;margin-bottom:5px; padding:7px;'>".$tries. " of 3 login attempts used.</div>";
}
}
?>
<html>
<head>
<title>Login</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="login-container">
<h2 class="login-header">Login</h2>
<?php echo $error_msg; ?>
<form method="post" action="" style="text-align:center">
<input type="text" placeholder="Username...(case sensitive)" name="username" />
<input type="password" placeholder="Password..." name="password" />
<input type="submit" name="submit" value="Login"/>
<br />
or...
<br />
<a href="/rail/reset-password" class="login-btn-alt">Reset Password</a>
<br />
<a href="/rail/register" class="login-btn-alt">Register Here</a>
</form>
</div>
</body>
</html>
Любое разъяснение относительно того, почему вход в систему не всегда работает с первого раза, было бы здорово.
Просто для подтверждения, это не сбой входа в систему. При неудачном входе в систему с неверными учетными данными будет отображаться сообщение, насчитывающее до 3. В консоли проверки etc или журнале ошибок apache2 нет сообщений об ошибках или проблемах.
Заранее спасибо.
Комментарии:
1. В чем польза
$checkrow
?2. Вы знаете, что если ваш пароль содержит пробелы в первых или последних символах,
trim($password)
это приведет к неверному паролю? То же самое дляstrip_tags($password)
иhtmlspecialchars($password)
3. Вы не должны хранить пароли в виде обычного текста, вы должны использовать
password_hash()
иpassword_verify()
.4. @Barmar есть
hash()
вызов, но вы правы насчетpassword_verify()
5.
htmlspecialchars
никогда не следует использовать для очистки ввода. Его следует использовать только при отображении предоставленных пользователем данных на веб-страницах, чтобы предотвратить XSS.