php защищенный паролем сайт

I ' Я новичок в веб-программировании, и я пытаюсь найти несколько хороших примеров / учебных пособий о том, как сделать достойную работу по созданию веб-сайта, который требует, чтобы пользователи входили в систему для просмотра любых страниц, кроме основной страницы входа.

До сих пор я Я нашел 1 или 2, которые я пробовал, но я продолжаю сталкиваться с той же проблемой. Если я просто введу URL страницы, которую я хочу увидеть вручную, я смогу войти, как будто там ничего не было.

6
задан hakre 24 December 2012 в 22:42
поделиться

7 ответов

Есть HTTP Auth:

http://php.net/manual/en/features.http-auth.php

Или вы можете использовать свою собственную с помощью формы входа и отслеживание сеанса:

http://www.php.net/manual/en/book.session.php .

Http-аутентификация означает, что пользователь получает всплывающее диалоговое окно с запросом имени пользователя и пароля, это менее обычное явление, чем в самоскручивающейся версии.

Наслаждайтесь!

1
ответ дан 9 December 2019 в 20:38
поделиться

Хорошо, я объясню, как работает основная концепция, и очень простую реализацию, чтобы все заработало.

PHP (и большинство веб-приложений) полагаются на службы RESTful, что, к нашему вниманию, означает, что каждый запрос не привязан удаленно к какому-либо другому выполненному запросу - будь то тот же пользователь или другие.

Что это значит?

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

Как это достигается?

На самом деле, многими способами. Существует множество методов, используемых для принудительной авторизации в веб-приложениях, но, по сути, оба они подразделяются на один из двух - централизованный или децентрализованный.

- Централизованно

Это означает, что все ваши действия (и контроллеры) обрабатываются в одном файле. Скажите index.php. Затем этот файл будет включать или делегировать свои задачи другим файлам (которые не могут быть запущены сами по себе с помощью обычных запросов) на основе параметров запроса. Это очень популярный подход, но не совсем простой для начинающих разработчиков. Примеры приложений, использующих этот подход, будут иметь URL-адреса типа: index.php? Do = register, index.php? Do = login, index.php? Do = showtopic & topic_id = 2 и т. Д.

Простая реализация этой техники выглядит так:

<?php
// index.php
define('RUNNING_APP', true);
// 1. place your auth code here, or...
switch ($_REQUEST['do']) {
    case 'register':
        // 2. or here
        include 'inc/register.php';
        break;

    case 'do_register':
        // 2. and here, and before every include.. and so forth.
        include 'inc/do_register.php';
        break;
}
?>

<?php
// inc/register.php
defined('RUNNING_APP') or die('Cannot access this script directly'); // make sure to break direct access
?>
<form action="index.php?do=do_register">
<!-- form elements -->
</form>

и так далее.

Я задокументировал, куда должен идти обычный код авторизации.

- Децентрализованный

Однако при использовании этого подхода ваш код авторизации должен располагаться в начале каждого файла. URL-адреса приложений такого типа обычно выглядят примерно так: register.php, login.php и так далее. Основная проблема здесь в том, что вам нужно выполнять всю логику аутентификации для каждого файла, как указано выше, и это может быть беспокойной работой, если ваши файлы увеличиваются в количестве. Удобное решение состоит в том, чтобы иметь эту логику в одном файле и включать этот файл (который убьет запрос на недостоверное лицо) перед любой вашей логикой. Простой пример:

<?php
// index.php
include('inc/auth.php');
// index logic
?>

<?php
// register.php
include 'inc/auth.php';
// register logic
?>

<?php
// inc/auth.php
$logged_in = false;
if (!$logged_in) {
    die ('You do not have permission to access this page. Please login');
}
?>
6
ответ дан 9 December 2019 в 20:38
поделиться

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

$username = $_POST['username'];
$passwordHash = md5( $_POST['password'] );

Имя пользователя и хешированный пароль должны храниться в вашей базе данных. Затем вы можете проверить соответствие в базе данных, используя:

$res = mysql_query("SELECT * FROM users WHERE username='".$username."' && password='".$password."'");

Когда пользователь найден, вы используете сеансы для хранения пользовательских значений, что позволит вам получить доступ к информации о пользователях на разных страницах. ПРИМЕЧАНИЕ: session_start () обычно помещается вверху страницы, но я помещу его здесь для удобства чтения.

if ( mysql_num_rows($res) ) {
  session_start();
  session_regenerate_id(); // regenerate session_id to help prevent session hijacking
  $row = mysql_fetch_assoc($res);
  $_SESSION['logged_on'] = true;
  $_SESSION['username'] = $row['username'];
  // add more session variables about the user as needed
}

На каждой странице, которую вы хотите защитить, вы добавляете следующее вверху этих страниц:

session_start();
if ( !isset($_SESSION['logged_on']) ) {
  header("Location: login.php"); // user is not logged in, redirect to login page
  exit;
}
// page content here
2
ответ дан 9 December 2019 в 20:38
поделиться

Это то же самое, что предлагал лорд Артемис, но это руководство легче для понимания и ориентировано на начинающих.

http://css-tricks.com/easily-password-protect-a-website-or-subdirectory/

1
ответ дан 9 December 2019 в 20:38
поделиться

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

1
ответ дан 9 December 2019 в 20:38
поделиться

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

При хранении информации о пользователях в базе данных, вероятно, вам также не следует хранить их пароли. Например:

name    password                            ...
-----------------------------------------------
Johnny  '3858f62230ac3c915f300c664312c63f'
Alice   '80338e79d2ca9b9c090ebaaa2ef293c7'
.
.
.

Пароль Джонни на самом деле «foobar», но в базе данных хранится md5 ('foobar') . Когда Джонни пытается войти в систему, он вводит свое имя пользователя («Джонни») и пароль («foobar»). В PHP вы хешируете введенный им пароль и вызываете значение его пароля из базы данных, в результате чего получаем:

if (md5('foobar') == '3858f62230ac3c915f300c664312c63f')

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

Пароль Алисы - foobaz. Она пытается войти в систему, но случайно набирает «foobar», пароль Джонни. это приводит к:

if(md5('foobar') == '80338e79d2ca9b9c090ebaaa2ef293c7')

Что является ложным . Опять же, вы не знаете, какой у Алисы пароль , просто она ввела неверный пароль.

Обратной стороной этой стратегии, конечно же, является то, что вы не можете сказать пользователю, каков его пароль, когда он его забудет - вы не знаете! Вы можете решить эту проблему, позволив пользователю сбросить свой пароль (до некоторой полуслучайной строки) вместо того, чтобы прямо сообщать ему, каков его пароль.

1
ответ дан 9 December 2019 в 20:38
поделиться

Он не использует PHP для аутентификации, но вы можете использовать htaccess для обеспечения аутентификации и, возможно, управлять файлом .htpasswd с помощью PHP:

http://www.freewebmasterhelp.com/tutorials/htaccess/

0
ответ дан 9 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: