PHP защищенный паролем веб-сайт

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

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

Есть HTTP Auth:

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

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

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

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

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

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

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

Так что это значит?

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

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

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

– Централизованный

Это означает, что все ваши действия (и контроллеры) обрабатываются через один файл. Скажем index.php. Затем этот файл включал или делегировал свои задачи другим файлам (которые не выполняются самостоятельно через обычные запросы) на основе параметров запроса. Это очень популярный подход, но не совсем прямой для новых разработчиков. Примеры приложений, использующих этот подход, будут иметь URLS типа: 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> 

и так далее.

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

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

Однако, используя этот подход, ваш auth-код должен идти в начале каждого отдельного файла. URL-адреса приложений такого типа обычно выглядят примерно так: register.php, login.php и т. Д. Основная проблема здесь заключается в том, что вам нужно выполнить всю логику auth для каждого файла, как указано выше, и это может быть тяжелая работа, если ваши файлы увеличиваются. Удобное решение состоит в том, чтобы иметь эту логику в одном файле и включать этот файл (который бы убил запрос для 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'); } ?> в <?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'); } ?> 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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