Исходный код
session_start();
require ('function.php');
if (!isset($_POST['ok'])) {
include ('login_form.inc.html');
} else {
$login = $_POST['login'];
$passwd = $_POST['pass'];
db_connect();
$sql = " SELECT * FROM `users` WHERE `user_name` = '$login' AND `passwd` = '$passwd' AND `status` = 'Y' ";
$result = mysql_query($sql);
if (mysql_num_rows($result)!=1) { <em>//такого пользователя нет</em>echo"Введены не верные логин или пароль";
} else {
//пользователь найден
$_SESSION['login']=$_POST['login'];
//устанавливаем login & pass
$_SESSION['pass']=$_POST['pass'];
Header("Location: timesheet_exp.php");
}
mysql_close();
}
Что не так в исходном коде
Самая крупная ошибка в этом коде заключается в хранении паролей в БД в открытом виде. Шифрование паролей — это стандарт, который обсуждается только в смысле способа, как лучше шифровать.
Другая крупная ошибка — архитектуре сессии. При успешном логине запоминать нужно не пароль, а идентификатор сессии, который должен быть связан с идентификатором пользователя. Помещать в сессию пароль, тем более в открытом виде, ни в коем случае нельзя.
Ещё одна типовая ошибка: отсутствие экранирования данных при формировании запроса, что открывает двери для SQL-инъекций.
На фоне таких серьёзных промахов обсуждать извлечение логики проверки пароля в отдельную функцию даже нет смысла обсуждать.
Теория
- Фаулер М. Архитектура корпоративных программных приложений. М., Вильямс, 2004.