PHP безопасная форма входа с SQLSRV - PullRequest
0 голосов
/ 28 декабря 2018

Это «второй день» моих экспериментов с 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 не так уж и безопасен.

Думая о будущих улучшениях, это может быть более серьезный вопрос, но будет ли разумнее подход вообще не хранить пароли в базе данных и как-то включать функцию генератора случайных паролей?Может быть, это слишком много, чтобы заняться сразу?

спасибо!:)

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