Разбор архитектурных ошибок кода проверки пароля и создания сессии пользователя


Исходный код

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.