Функция PHP Autologin для входа в скрипт

Как бы я внедрил функцию автологина в этот скрипт?

session_start();
$result = mysql_query("SELECT id FROM users 
                       WHERE username = '{$_POST['username']}' 
                       AND password = '{$_POST['password']}'");

     if (isset($_POST['savelogin'])) {
     setcookie("SaveLogin", $_POST['username'], time()+3600);
     setcookie("SaveLogin", $_POST['password'], time()+3600);
     }


if (mysql_num_rows($result) == 0) {
    exit('wrong username/password');

    } else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
    header("Location: ./");
    }



<form method="post">


Username: <input type="text" name="username" size="22" /><br>
Password: <input type="password" name="password" size="22" /><br>

<br>
Autologin? <input type="checkbox" name="savelogin" />

<input type="submit" value="Login" />

</form>

Вот как далеко я прошел. Сохранение имени пользователя и пароля. Но как мне сделать так, чтобы это происходило?

3 ответа

Во-первых, вы не хотите сохранять имя пользователя и пароль в куки. Это плохая идея.

Простой способ думать об этом будет:

1) Создайте новое поле в таблице пользователей, в котором хранится хэш MD5. Вы можете назвать это session_key.
2) Когда вы отправляете страницу, скрипт должен сделать следующее.

  • Подтвердите имя пользователя и пароль
  • Если это хорошая пара имени пользователя и пароля, проверьте переменную saveLogin
  • Если переменная saveLogin установлена, сгенерируйте md5 и сохраните его в базе данных. Также сохраните этот md5 в cookie. Убедитесь, что в таблице базы данных также есть поле cookie-expires.
  • Создайте данные сеанса, которые вам нужны.
  • Перенаправить на./

3) На своей странице./ сделайте следующее:

  • Проверьте, существует ли еще сеанс. Если так, то визуализируйте страницу.
  • Если сеанс не существует, проверьте наличие cookie.
  • Если файл cookie существует, найдите этот идентификатор сеанса в базе данных и убедитесь, что он не истек. затем создайте сеанс и визуализируйте страницу.

Это должно сделать ваше приложение более безопасным. Возможно, это не лучший способ кодирования, но концепции должны дать вам представление о том, как создать достаточно безопасную страницу входа.

Это очень небезопасный метод автоматического входа в систему. Вы никогда не должны хранить пароль в любом месте в виде открытого текста.

Лучшая стратегия заключается в следующем:

  1. Представьте нормальную форму входа в систему с флажком "автоматический вход".
    • Если флажок автоматического входа установлен, то вы обычно проверяете их имя пользователя и пароль. Если это успешно, вы можете установить специальный файл cookie для автоматического входа.
    • Дайте специальному файлу cookie имя, например "autologin", и значение, которое содержит их имя пользователя и соленый хэш md5 их пользовательских данных. Что-то вроде "user=username&hash=123456xyz.etc".
    • Когда вы в следующий раз увидите пользователя и захотите войти в систему автоматически, вы проверяете наличие этого специального файла cookie и проверяете его содержимое. Выделите имя пользователя и хэш, затем извлеките учетную запись из базы данных на основе имени пользователя и повторите md5, чтобы сравнить с данными хэша cookie. Если он действителен, вы можете войти в него (т.е. начать новый сеанс).

Мы можем создать автоматический вход с использованием файлов cookie в php, эта функция необходима, если вы хотите создать веб-представление своего веб-сайта, поскольку мобильный пользователь не хочет входить в систему каждый раз, когда они открывают ваше приложение для Android (веб-представление вашего веб-сайта. Вы можете использовать приведенный ниже код, чтобы реализовать автоматический вход на свой веб-сайт на основе php.

<?php

session_start();

include(“connect.php”); // your mysql connect code

// code to read user name and password in cookies on client machine
if(isset($_COOKIE[“username”])) $email= $_COOKIE[“username”]; else $email=””;
if(isset($_COOKIE[“password”])) $pwd=$_COOKIE[“password”]; else $pwd=””;

// if cookies are set for login details then we compare the login details with database //and redirect the user directly to page after login so user is not required to input //login details and then  click on login button

if ($email!=””)
{
$sql= “select * from members where username='”.$email.”‘ and user_pwd='”.$pwd.”‘”;
$result = mysqli_query($con,$sql);
$row = mysqli_fetch_array($result);
$count = mysqli_num_rows($result);
if($count > 0 && $row[‘auto_login’]==1)
{

$_SESSION[‘uname’] = $email;
$_SESSION[‘uid’]=$row[‘id’];
setcookie (“username”,$email,time()+ 3600);
setcookie (“password”,$pwd,time()+ 3600);
header(‘Location:myhome.php’);
}
}
?>
<!DOCTYPE html>
<html lang=”en”>
<head>
<title>My Expense-Login</title>
<meta charset=”utf-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
<link rel=”stylesheet” href=”https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css”>
<script src=”https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js”></script>
<script src=”https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js”></script>
</head>
<body>
<?php include(“top-menu-login.php”); ?>
<div class=”container”>
<div class=”row”>

<div class=”col-md-3″></div>
<div class=”col-md-6″>
<h2 class=”text-center”>User Login</h2>

<div id=”message”></div>
<div class=”form-group”>
<label for=”email”>Email address:</label>

<!– here we check if cookies is set then auto fill the login details –>
<input type=”email” class=”form-control” id=”email” name=”email” value=”<?php if(isset($_COOKIE[“username”])) { echo $_COOKIE[“username”]; } ?>”>
</div>
<div class=”form-group”>
<label for=”pwd”>Password:</label>
<input type=”password” class=”form-control” id=”pwd” name=”pwd” value=”<?php if(isset($_COOKIE[“password”])) { echo $_COOKIE[“password”]; } ?>” >
</div>
<div class=”form-group ml-4″>
<label class=”form-check-label”>
<input class=”form-check-input” type=”checkbox” name=”remember” id=”remember” <?php if(isset($_COOKIE[“username”])) { echo “checked”; } ?>> Auto Login
</label>
<label class=”form-signup”>
<a href=”forgot-pass.php” class=”btn btn-light”> Forgot Passsword </a>
</label>
</div>
<button type=”button” class=”btn btn-primary” id=”btn-submit”>Submit</button>
<button type=”button” class=”btn btn-success” id=”btn-register”>Register</button>

</div>
<div class=”col-md-3″><br>

</div>
</div>
</div>
</body>
</html>

Вы должны взять их имя пользователя, IP-адрес и какой-то хэш (как предложил zombat), зашифровать все это (возможно, используя Base64) и сохранить полученную строку в виде их cookie. Таким образом, кто-то не может подделать или украсть куки, потому что даже если они это сделают, дешифрованный IP-адрес не будет совпадать с IP-адресом, с которого поступил запрос. Также лучше использовать белые списки, а не отбрасывать пользовательский ввод в запрос.

Таким образом, вы получите что-то вроде:

//First see if the auto-login cookie exists and is valid:

if($_COOKIE['autologin']) {
$users_query = "SELECT username FROM users WHERE last_login < SUBDATE(CURDATE(),30)";
$users_results = mysql_query($users_query);
while($row = mysql_fetch_assoc($users_result)) {
    $users = $row['username'];
}
$auto_cookie = $_COOKIE['autologin'];

$user_creds = explode("//", base64_decode($auto_cookie));

$user_name = $user_creds[0];
$user_IP = $user_creds[1];
$user_hash = $user_creds[2];

$username_check = (in_array($user_name, $users) ? true : false;
$userIP_check = ($user_IP = $_SERVER['REMOTE_ADDR']) ? true :false;

$so_far_so_good = ($username_check && $userIP_check) ? true : false;

if($so_far_so_good) {
$hash_query = "SELECT hash FROM userhash WHERE username = '$user_name'";
$hash_results = mysql_query($hash_query);
$all_clear = ($user_hash == mysql_result($hash_results,0)) ? true : false;
}

}

//Checks Login Data:
if($_POST) {
    $users_query = "SELECT username FROM users";
$users_results = mysql_query($users_query);
while($row = mysql_fetch_assoc($users_result)) {
    $users = $row['username'];
}

$username_check = (in_array($user_name, $users) ? true : false;

$password_check = password_check();
// I do not feel comfortable enough with encryption and authentication to suggest
// a method here. Suffice to say, you should have a strong password check system.

$all_clear = ($username_check && $password_check) ? true : false;

// You should only throw a log in error when they have attempted a login. Do not
// give hints at your authentication methods in auto-login section.

$set_cookie = ($all_clear && $_POST['set-auto']) ? true : false;
if($set_cookie) {
   $new_hash = hash_maker();
   // Again, look to the others for best hashing technique.
   $raw_cookie_data = $user_name . "//" . $_SERVER['REMOTE_ADDR'] . "//" . $new_hash;
   $enc_cookie_data = base64_encode($raw_cookie_data);
   setcookie("autologin", $enc_cookie_data, time()+3600);
    }
}

if($all_clear) {
   echo "Welcome Back!";
  }
 else {
    //print login form here...
 }
Другие вопросы по тегам