Это «второй день» моих экспериментов с php, и я пытаюсь собрать форму безопасного входа в систему с php / MS SQL (sqlsrv).
Посмотрел несколько примеров, и все они в значительной степени ссылаются на mysql, что не совсем соответствует моим потребностям.
Кроме того, как к вашему сведению (до того, как кто-то скажет, почему вы не используете PDO), мне не повезло, если бы PDO работал в моей локальной среде (php 7.2), поэтому я былпридерживаясь команд типа sqlsrv.
Вот что я пытался создать до сих пор:
page.php page
class getUsers {
function get_all_users() {
global $conn;
$dbUsers = [];
$sql = "SELECT user_name, user_password FROM users";
$stmt = sqlsrv_query($conn, $sql) or die( print_r(sqlsrv_errors(), true));
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
array_push($dbUsers, $row);
}
return $dbUsers;
sqlsrv_free_stmt($stmt);
}
}
ПервыйЯ знаю, что это не самый лучший способ сделать это, я должен, вероятно, просто получить одну запись, а не все записи, но я использую метод, который я использовал из другого поста SO.
страница login.php
<?php
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
include_once("../includes/connection.php");
include_once("../includes/data.php");
$udata = new getUsers();
$udatas = $udata->get_all_users();
$userlist = array_column($udatas, null, 'user_name');
if(isset($_SESSION['logged_in'])) {
//go to logged in page.
echo "session state = logged in";
} else {
//display login
if(isset($_POST['username'])) {
$username = $_POST['username'];
$password = $_POST['password'];
if (empty($username) or empty($password)) {
$error = 'All fields are required';
} else if (isset($userlist[$username], $userlist[$password])) {
$_SESSION['username'] = $username;
echo "logged in, should only display when logged in.";
//header('Location: cp-logged-in.php');
} else {
$error = "Invalid user information";
}
}
}
?>
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
<link rel="stylesheet" href="../css/styles.css" />
</head>
<body>
<div class="grid-header">
<?php include("../includes/header.php"); ?>
</div>
<div class="grid-login">
<?php include("cp-login.php") ?>
</div>
</body>
</html>
Множество проблем с этим:
1) Поскольку я не проверяю входные данные почасть базы данных правильная, на самом деле она не будет входить в систему.
2) Здесь подразумевается ноль безопасности, и, как я понял на SO, по крайней мере, ядолжен делать какой-то хэштег / засоление pw и, возможно, некоторые другие вещи для защиты от SQL-инъекций.
Итак, к первому вопросу я уверен, что есть более эффективный способ проверить un /pw против базы данных.В идеале я хотел бы сохранить функцию входа в отдельный файл (чтобы он был чище), но, возможно, это усложнит ситуацию?(поскольку это потребовало бы передачи переменных имени пользователя / пароля назад и вперед между двумя страницами php).
И ко второму вопросу, при рассмотрении пары статей по безопасности, было бы blowfish или родной пароль php password_hash ()быть в пути?Насколько я понимаю, md5 не так уж и безопасен.
Думая о будущих улучшениях, это может быть более серьезный вопрос, но будет ли разумнее подход вообще не хранить пароли в базе данных и как-то включать функцию генератора случайных паролей?Может быть, это слишком много, чтобы заняться сразу?
спасибо!:)