Как аутентифицировать пользователя в PHP / MySQL? - PullRequest
8 голосов
/ 26 марта 2009

Итак, недавно я научился правильно добавлять имя пользователя и пароль в базу данных. Моя база данных - usersys, а таблица, хранящая информацию о пользователях, называется userdb. Таблица имеет два столбца - имя пользователя (основной), пароль.

Форма регистрации отлично работает, правильно вводит ввод данных в базу данных, а также проверяет, есть ли имя пользователя в базе данных или нет.

С учетом вышесказанного я спрашиваю, может ли кто-нибудь помочь мне создать сценарий входа в систему. Пока что вот что у меня есть:

$username = $_POST['username'];
$password = $_POST['password'];
$displayname = $_POST['username'];
$displayname = strtolower($displayname);
$displayname = ucfirst($displayname);           
echo "Your username: " . $displayname . "<br />";

mysql_connect("localhost", "root", "******") or die(mysql_error());
echo "Connected to MySQL<br />";

mysql_select_db("usersys") or die(mysql_error());
echo "Connected to Database <br />";

$lcusername = strtolower($username);
$esclcusername = mysql_real_escape_string($lcusername);
$escpassword = mysql_real_escape_string($password);

$result = mysql_query("SELECT * FROM userdb WHERE username='$esclcusername' AND     password='$escpassword'") or die(mysql_error());
$row = mysql_fetch_array( $result );
$validateUser = $row['username'];
$validatePass = $row['password'];

Данные POST взяты из предыдущей страницы входа. Я хочу, чтобы этот скрипт проверял таблицу (userdb) и находил строку для имени пользователя, введенного пользователем из предыдущей формы, и проверял, чтобы введенный пароль совпадал с паролем имени пользователя, установленным в этой строке, в таблице userdb.

Я также хочу, чтобы какой-то способ проверки, существует ли введенное имя пользователя, сообщает пользователю, что введенное имя не существует, если его нельзя найти в таблице.

Ответы [ 7 ]

12 голосов
/ 26 марта 2009

Это не прямой ответ на этот вопрос, а ХОРОШАЯ добавленная стоимость. Вы должны использовать функцию MYSQL SHA1 для шифрования пароля перед сохранением в базе данных.

$user = $_POST['userid'];
$pwd = $_POST['password'];
$insert_sql = "INSERT into USER(userid, password) VALUES($user, SHA1($pwd))";

$select_sql = "SELECT * FROM USER WHERE userid=$user AND password=SHA1($pwd))";
7 голосов
/ 26 марта 2009

Вы можете использовать сеансы. Сессии - это глобальные переменные, которые, если они установлены, остаются с пользователем, пока он просматривает сайт.

Поскольку вы изучаете PHP, попробуйте этот урок на официальном сайте.

Но в теории вы должны делать, когда имя пользователя и пароль совпадают, вы устанавливаете переменную сеанса

$_SESSION["auth"] = true;
$_SESSION["user_id"] = $row["user_id"];

А затем проверьте, аутентифицирован ли пользователь.

3 голосов
/ 26 марта 2009

Один из способов сделать это (ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: не обязательно лучшие практики):

$result = mysql_query("SELECT id FROM userdb WHERE username='$esclcusername' AND  password='$escpassword'") or die(mysql_error());
$row = mysql_fetch_array( $result );
$id = (int)$row['id'];
if($id > 0) {
    //log in the user
    session_start();
    $_SESSION['userId'] = $id;
    $_SESSION['username'] = $displayname;
}

... и на страницах, требующих аутентификации:

session_start();
if(!isset($_SESSION['userId'])) {
    die('You need to be logged in!!!');
} else {
    echo 'Welcome ' . $_SESSION['username'];
}

Подробнее о сессиях PHP .

2 голосов
/ 13 февраля 2012

Мне нравится использовать обе проверки $_SESSION и MYSQL при любом входе в систему POST. Это должно помочь начать несколько вещей.

$username = mysql_real_escape_string($_POST[username]);
$password = strip_tags($_POST[password]);
$password = sha1($password);

if(isset($username) && isset($password) && !empty($username) && !empty($password))
{
$sql = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'");

//Check the number of users against database
//with the given criteria.  We're looking for 1 so 
//adding > 0 (greater than zero does the trick). 
$num_rows = mysql_num_rows($sql);
if($num_rows > 0){

//Lets grab and create a variable from the DB to register
//the user's session with.
$gid = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'");
$row = mysql_fetch_assoc($gid);
$uid = $row[userid];

// This is where we register the session.
$_SESSION[valid_user] = $uid;

//Send the user to the member page.  The userid is what the 
//session include runs against.
header('Location: memberpage.php?userid='.$userid);
}

//If it doesn't check out -- throw an error.
else
{
echo 'Invalid Login Information';
}
}

ПРИМЕЧАНИЕ. Вам нужно будет запустить файл подкачки с session_start() и создать отдельную проверку сеанса, включающую указание с session_start(), а затем ваши успехи, например. if($_SESSION[valid_user] != $userid) сделай что-нибудь.

0 голосов
/ 09 ноября 2013

Я согласен с идеей, если при аутентификации пользователя используются переменные SESSION.

Простой способ аутентификации пользователя заключается в следующем

//connect the mysql_db
$mysql_connect()
$mysql_select_db() 

//reading from mysql table
$res="SELECT * FROM table WHERE name=$username AND password=$password";
$val=mysql_query($res);

//authentication
$count=mysql_num_rows($val);
if($count==1)
//authenticate the user
else
through an error
0 голосов
/ 26 марта 2009

Я бы также подумал о том, чтобы не хранить пароли в вашей базе данных. Односторонние хеши с MD5 или SHA1 - это способ добавить уровень безопасности на уровне базы данных.

См. http://php.net/md5 или http://php.net/sha1 для получения дополнительной информации.

0 голосов
/ 26 марта 2009

Вы можете использовать оператор select, чтобы получить из MySQL пароль для указанного имени пользователя. Если у вас есть пустой набор результатов, то у вас нет имени пользователя в таблице.

Если вам нужно, чтобы пользователь прошел аутентификацию на нескольких страницах php, то одним из вариантов будет использование сеансов (http://www.php.net/manual/en/function.session-start.php).

Кроме того, я думаю, вам следует подумать о безопасности, то есть о предотвращении внедрения SQL:

$variable = mysql_real_escape_string($_POST['variable'])

и избегание «умирания» (лечение ошибок и возврат удобных для пользователя сообщений из скрипта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...