#php #session
Вопрос:
Я создал системы регистрации и входа в систему для своего веб-сайта галереи. Когда пользователь пытается войти в систему, проверяется его пользователь, пароль и права администратора. Если это было успешно, имя пользователя отображается в левом верхнем углу домашней страницы, и Вход в систему превращается в Выход. Проблема в том, что при обновлении страницы пользователь выходит из системы.
login.php код:
<?php
session_start();
class User
{
public function CheckUser()
{
require "../app/core/database.php";
if (isset($_POST['username']) amp;amp; isset($_POST['pass'])) {
$username = $_POST['username'];
$password = $_POST['pass'];
//to prevent sql injection
$username = stripcslashes($username);
$password = stripcslashes($password);
$username = mysqli_real_escape_string($connection, $username);
$password = mysqli_real_escape_string($connection, $password);
$sql = "SELECT * FROM signup WHERE username = '$username' and password = '$password'";
$sql2 = "SELECT 'admin' FROM signup";
$log_result = mysqli_query($connection, $sql);
$count = mysqli_num_rows($log_result);
if ($count == 1) {
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
$_SESSION['is_admin'] = mysqli_query($connection, $sql2);
header("Location: ../home/index");
} else {
echo "<script>Invalid()</script>";
}
}
}
}
?>
<script>
function Invalid() {
alert("Invalid user/password");
}
</script>
часть кода домашней страницы (index.php):
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
include "../app/model/loadImages.php";
include "../app/core/config.php";
include "../app/model/login.php";
?>
<body>
<nav>
<?php while ($row = $result2->fetch_assoc()) {
$rows[] = $row ?>
<div class="logo">
<a href="index.php"><?php echo $row['header_1'] ?> <em><?php echo $row['header_2'] ?></em></a>
<span style="font-weight: normal; color:white;">
<label>
<?php
if (isset($_SESSION['loggedin']) amp;amp; isset($_SESSION['username'])) {
echo $_SESSION['username'];
} ?>
</label>
</span>
</div>
<div class="menu-icon">
<span></span>
</div>
</nav>
<section class="overlay-menu">
<div class="container">
<div class="row">
<div class="main-menu">
<ul>
<li>
<?php
if (!isset($_SESSION['loggedin']) amp;amp; !isset($_SESSION['username'])) {
echo "<a href='/MyProject/public/login/index.php'>LogIn</a>";
} else {
echo "<a href='' action='EndSession();'>Logout</a>";
echo "<li>";
echo "<a href='/MyProject/public/admin/index'>Admin Area</a>";
echo "</li>";
} ?>
</li>
<li>
<a href="about.html">About Us</a>
</li>
<li>
<a href="blog.html">Blog Entries</a>
</li>
<li>
<a href="single-post.html">Single Post</a>
</li>
</ul>
<?php foreach ($rows as $row) { ?>
<p><?php echo $row['message_1'] ?></p>
<?php } ?>
</div>
</div>
</div>
</section>
<script>
function EndSession() {
<?php session_unset(); ?>
}
</script>
index.php для страницы входа в систему:
<?php
include "../app/core/config.php";
include "../app/model/login.php";
$login = new User();
$login->CheckUser();
?>
<body>
<div class="limiter">
<div class="container-login100" style="background-image: url('../../app/views/login/images/bg-01.jpg');">
<div class="wrap-login100 p-l-55 p-r-55 p-t-65 p-b-54">
<form class="login100-form validate-form" method="POST">
<span class="login100-form-title p-b-49">
Login
</span>
<div class="wrap-input100 validate-input m-b-23" data-validate = "Username is reauired">
<span class="label-input100">Username</span>
<input class="input100" type="text" name="username" placeholder="Type your username">
<span class="focus-input100" data-symbol="amp;#xf206;"></span>
</div>
<div class="wrap-input100 validate-input" data-validate="Password is required">
<span class="label-input100">Password</span>
<input class="input100" type="password" name="pass" placeholder="Type your password">
<span class="focus-input100" data-symbol="amp;#xf190;"></span>
</div>
<div class="text-right p-t-8 p-b-31">
<a href="#">
Forgot password?
</a>
</div>
<div class="container-login100-form-btn">
<div class="wrap-login100-form-btn">
<div class="login100-form-bgbtn"></div>
<button class="login100-form-btn">
Login
</button>
</div>
</div>
<div class="txt1 text-center p-t-54 p-b-20">
<span>
Or Sign Up Using
</span>
</div>
<div class="flex-c-m">
<a href="#" class="login100-social-item bg3">
<i class="fa fa-google"></i>
</a>
</div>
<div class="flex-col-c p-t-155">
<span class="txt1 p-b-17">
Or Sign Up Using
</span>
<a href="<?php echo $root ?>/public/signup/index.php" class="txt2">
Sign Up
</a>
</div>
</form>
</div>
</div>
</div>
Как я могу решить эту проблему?
Комментарии:
1. он использует сеанс из Login.php
2. Предупреждение! Никогда не храните пароли в виде обычного текста! Вы должны хранить только хэши паролей, сгенерированные с помощью password_hash () , и для повторной проверки пароля с помощью хэша используйте password_verify() .
3. К вашему сведению, полосатые косые черты не имеют ничего общего с внедрением sql и не помогают предотвратить это. Все, что это сделает в вашем случае, — это потенциально предотвратит вход пользователя в систему, изменив его пароль
4. В любом случае, ваша домашняя страница где-нибудь вызывает session_start ()?
5. Можете ли вы добавить код, в котором вы вызываете функцию CheckUser() внутри пользовательского класса?
Ответ №1:
Я повторил проблему. session_unset внутри функции js вызывается при обновлении страницы, кроме того, он находится внутри функции JS.
Удалите эту функцию, чем создайте новый файл под названием logout.php:
<?php
session_unset();
header("Location: ../home/index.php");
?>
Измените тег a внутри home/index.php:
<a href='logout.php'>Logout</a>
Примечание: рассмотрите возможность использования session_destroy() вместо session_unset() для выхода из системы
Ответ №2:
Вы должны создать сеанс и установить куки , этот метод, я надеюсь, поможет вам
Сначала выберите проверить пользователя : функция проверки пароля работает, если вы храните пароль с помощью алгоритма bcrypt
<?php
if(isset($_POST["username"])) {
$u = $dbmysqli->real_escape_string($_POST['username']);
$p = $_POST['p'];
$sql = $dbmysqli->prepare('SELECT username, password FROM users WHERE username = ?');
$sql->bind_param("s", $u);
$sql->execute();
$sql->store_result();
}
if ($sql->num_rows > 0) {
$sql->bind_result($db_id, $db_username, $db_pass_str);
$sql->fetch();
if (password_verify($p, $db_pass_str)) {
// Verification success! User has logged-in!
// Create sessions, so we know the user is logged in, they basically act like cookies but remember the data on the server.
session_regenerate_id(TRUE);
$_SESSION['userid'] = $db_id;
$_SESSION['username'] = $db_username;
$_SESSION['password'] = $db_pass_str;
setcookie("id", $db_id, strtotime(' 30 days'), "/", "", "", TRUE);
setcookie("user", $db_username, strtotime(' 30 days'), "/", "", "", TRUE);
setcookie("pass", $db_pass_str, strtotime(' 30 days'), "/", "", "", TRUE);
echo $db_username;
exit();
} else {
// Incorrect password
echo 'login_failed';
}
}
?>
Затем вам нужно создать статус проверки входа в систему file.php вот так (включите это на каждой странице, если вы хотите, чтобы пользователь оставался в системе) :
<?php
$user_ok = FALSE;
$log_id = "";
$log_username = "";
$log_password = "";
function evalLoggedUser($dbmysqli,$id,$u,$p){
$sql = $dbmysqli->prepare('SELECT email FROM users WHERE id = ? AND uname = ? AND pswd = ?');
$sql->bind_param("sss", $id,$u,$p);
$sql->execute();
$sql->store_result();
$numrows = $sql->num_rows;
if($numrows > 0){
return true;
}
}
if(isset($_SESSION["userid"]) amp;amp; isset($_SESSION["username"]) amp;amp; isset($_SESSION["password"])) {
$log_id = preg_replace('#[^0-9]#', '', $_SESSION['userid']);
$log_username = preg_replace('#[^a-z0-9]#i', '', $_SESSION['username']);
$log_password = $_SESSION['password'];
//$log_password = preg_replace('#[^a-z0-9$./]#i', '', $_SESSION['password']);
$user_ok = evalLoggedUser($dbmysqli,$log_id,$log_username,$log_password);
} else if(isset($_COOKIE["id"]) amp;amp; isset($_COOKIE["user"]) amp;amp; isset($_COOKIE["pass"])){
$_SESSION['userid'] = preg_replace('#[^0-9]#', '', $_COOKIE['id']);
$_SESSION['username'] = preg_replace('#[^a-z0-9]#i', '', $_COOKIE['user']);
$_SESSION['password'] = $_COOKIE['pass'];
//$_SESSION['password'] = preg_replace('#[^a-z0-9$./]#i', '', $_COOKIE['pass']);
$log_id = $_SESSION['userid'];
$log_username = $_SESSION['username'];
$log_password = $_SESSION['password'];
$user_ok = evalLoggedUser($dbmysqli,$log_id,$log_username,$log_password);
if ($user_ok == TRUE);
}
?>
И, наконец, logout.php :
<?php
session_start();
$_SESSION = array();
if(isset($_COOKIE["id"]) amp;amp; isset($_COOKIE["user"]) amp;amp; isset($_COOKIE["pass"])) {
setcookie("id", '', strtotime( '-5 days' ), '/');
setcookie("user", '', strtotime( '-5 days' ), '/');
setcookie("pass", '', strtotime( '-5 days' ), '/');
}
session_destroy();
if(isset($_SESSION['username'])){
header("location: message.php?msg=Error:_Logout_Failed");
} else {
header("location: login.php");
exit();
}
?>
Комментарии:
1. Пожалуйста, не рекомендуйте людям хранить учетные данные в файлах cookie! Любой, у кого есть доступ к компьютеру пользователей, также получит доступ к учетным данным пользователей! Никогда не храните конфиденциальную информацию в клиенте! Вам также не нужно хранить учетные данные в сеансе.