Как я буду использовать функцию автолога для этого скрипта?
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>
То, как далеко я получил. Сохранение имени пользователя и пароля. Но как мне это сделать, это автологин?
Во-первых, вы не хотите сохранять имя пользователя и пароль в cookie. Это плохая идея.
Простым способом думать об этом было бы:
1) Создайте новое поле в таблице пользователей, в котором хранится хеш MD5. Вы можете вызвать его session_key.
2) Когда вы отправляете страницу, сценарий должен сделать следующее.
3) На странице ./ выполните следующие действия:
Это должно сделать ваше приложение более безопасным. Это может быть не лучший способ кодирования, но концепции должны дать вам представление о том, как сделать безопасную страницу входа в систему.
Это очень небезопасный метод автоматического входа в систему. Вы никогда не должны хранить пароль в любом месте в открытом тексте.
Лучшая стратегия заключается в следующем:
Вы должны взять свое имя пользователя, IP-адрес и какой-то хэш (как предлагал зомбат), зашифровать все (возможно, используя Base64) и сохранить полученную строку в качестве своего файла cookie. Таким образом, кто-то не может обмануть или украсть файл 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... }