В качестве заголовка я задаю этот вопрос, потому что единственный способ узнать, вошел ли пользователь в систему, состоит в том, чтобы в верхней части каждого файла был сеанс и запрос к базе данных для сравнения значения сеансов.

У меня есть что-то вроде этой функции, затем я вызываю эту функцию поверх каждого php-файла, это прекрасно работает. Однако я не думаю, что такой подход есть у большого веб-сайта, такого как Facebook, YouTube и т. Д. Это также означает, что все мои файлы должны быть .php, у меня не может быть .html, так как я не смогу работать функция ниже.

public function isSessionValid()
{
    session_start();
    $dbConfig = new dbconfig("users");
    $dbUser = $dbConfig->getDbUser();
    $getUser = new GetUser($dbUser);
    $result = $getUser->getUser($_SESSION['UN'],$_SESSION['PW'] );
    if(!count($result) > 0){
        header("Location: ../index.html");
    }
}

Мой вопрос: каковы другие эффективные способы проверки учетных данных пользователей?

-1
LukeDS 18 Авг 2019 в 22:12

2 ответа

Лучший ответ

Вы не хотите иметь что-то вроде:

$ _SESSION [ ' PW ']

Обычные текстовые незашифрованные пароли представляют собой серьезную проблему. Вы можете сделать что-то, где при входе в систему вы создаете токен доступа, который представляет собой случайную хеш-строку и которая сохраняется в файлах cookie пользователей.

Вот пример:

function login()
{
    $userName = 'billy';
    $password = 'foobar';

    // get your user data using username and password.
    $userObject = new User();
    $userId = $userObject->id;

    // create our secure hash.
    $accessToken = password_hash($password, PASSWORD_DEFAULT);

    // update the user in the row.
    mysqli_query($link, "UPDATE users set access_token='$accessToken' WHERE id = $userId");

    // expires in 1 day, auto logout.
    setcookie('userAccessToken', $accessToken, time() + 86400);
}

function getUser() {
    return mysqli_query($link, "SELECT * from users WHERE access_token = ".$_COOKIE['userAccessToken']);
}

Теперь вам нужно проверить только один атрибут, который является токеном доступа и хранится в файлах cookie на случай, если они вернутся. Использование хеш-подхода предотвращает прослушивание куки-файлов и получение личной информации.

Для удобства сопровождения кода вы не хотите дублировать код и всегда должны стараться создавать небольшие повторно используемые компоненты, которые можно использовать на всех ваших страницах. Создайте файл PHP с именем auth.php, а затем просто укажите его на тех страницах, где он вам нужен.

// UserPage.php
require_once __DIR__.'/lib/auth.php';

$user = getUser();

// MessagePage.php
require_once __DIR__.'/lib/auth.php';

$user = getUser();

// lib/auth.php
function getUser() {
   return mysqli_query($link, "SELECT * from users WHERE access_token = ".$_COOKIE['userAccessToken']);
}

В качестве дополнительного примечания, вместо того, чтобы писать свое приложение на простом php и создавать собственную платформу, я рекомендую вам оформить заказ laravel.com. , У них есть видеоуроки, а фреймворк решает множество общих проблем, с которыми сталкиваются разработчики, включая эту.

0
marc_s 19 Авг 2019 в 13:18

Одним из решений будет настройка веб-сервера на автоматическую маршрутизацию всех запросов сначала через isSessionValid(), а затем к их фактическому месту назначения.

0
Skilly 18 Авг 2019 в 19:15