php защищенный паролем сайт - PullRequest
6 голосов
/ 10 августа 2010

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

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

Ответы [ 7 ]

6 голосов
/ 10 августа 2010

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

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 и т. Д.Основная проблема здесь заключается в том, что вам нужно выполнять всю логику аутентификации для каждого файла, как указано выше, и это может быть беспокойной работой, если ваши файлы увеличиваются в объеме.Удобное решение состоит в том, чтобы иметь эту логику в одном файле и включать этот файл (который убил бы запрос на unauth personel) перед любой вашей логикой.Простым примером будет:

<?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');
}
?>
2 голосов
/ 10 августа 2010

При входе в систему с помощью формы, вы должны проверить имя пользователя и пароль в базе данных.Пароль должен быть зашифрован (обычно делается с использованием алгоритма хеширования 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
1 голос
/ 10 августа 2010

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

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

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

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

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

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

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

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

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

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

1 голос
/ 10 августа 2010

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

1 голос
/ 10 августа 2010

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

http://css -tricks.com / легко защищать паролем веб-сайт или подкаталог /

1 голос
/ 10 августа 2010

Есть HTTP-аутентификация:

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

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

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

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

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

0 голосов
/ 10 августа 2010

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

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

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