Управление пользователями с помощью PHP-сессий и MySQL

  1. Часть первая: процесс регистрации
  2. Сценарий регистрации
  3. Часть вторая: управление доступом
  4. Сессии PHP
  5. Скрипт контроля доступа
  6. Заворачивать

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

ПРИМЕЧАНИЕ. Эта статья была недавно обновлена ​​для работы на PHP 4.2 или более поздней версии!

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

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

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

В этой статье я буду предполагать, что у вас есть базовые знания о языке PHP, об использовании форм для отправки информации в сценарий PHP и о том, как PHP можно использовать для взаимодействия с базой данных MySQL. Если что-то из этого является для вас чуждым понятием, вам следует начать с прочтения моей предыдущей статьи: Создание веб-сайта на основе базы данных с использованием PHP и MySQL ,

Часть первая: процесс регистрации

Форма регистрации

Естественным местом для начала создания сайта, который потребует от пользователей регистрации для доступа, является сам процесс регистрации. Как и следовало ожидать, простая веб-форма сделает свое дело. Вот как это будет выглядеть:

И вот код для этой формы:

<! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<Голова>
<title> Регистрация нового пользователя </ title>
<meta http-equ = "Content-Type" content = "text / html; charset = iso-8859-1" />
</ HEAD>
<Тело>
<h3> Форма регистрации нового пользователя </ h3>
<p> <font color = "orangered" size = "+ 1"> <tt> <b> * </ b> </ tt> </ font> указывает на обязательное поле </ p>
<form method = "post" action = &quot;<? = $ _ SERVER ['PHP_SELF']?>">
<table border = "0" cellpadding = "0" cellspacing = "5">
<TR>
<td align = "right">
<p> идентификатор пользователя </ p>
</ TD>
<TD>
<input name = "newid" type = "text" maxlength = "100" size = "25" />
<font color = "orangered" size = "+ 1"> <tt> <b> * </ b> </ tt> </ font>
</ TD>
</ TR>
<TR>
<td align = "right">
<p> Полное имя </ p>
</ TD>
<TD>
<input name = "newname" type = "text" maxlength = "100" size = "25" />
<font color = "orangered" size = "+ 1"> <tt> <b> * </ b> </ tt> </ font>
</ TD>
</ TR>
<TR>
<td align = "right">
<p> Адрес электронной почты </ p>
</ TD>
<TD>
<input name = "newemail" type = "text" maxlength = "100" size = "25" />
<font color = "orangered" size = "+ 1"> <tt> <b> * </ b> </ tt> </ font>
</ TD>
</ TR>
<tr valign = "top">
<td align = "right">
<p> Другие заметки </ p>
</ TD>
<TD>
<textarea wrap = "soft" name = "newnotes" rows "5" cols = "30"> </ textarea>
</ TD>
</ TR>
<TR>
<td align = "right" colspan = "2">
<hr noshade = "noshade" />
<input type = "reset" value = "Сбросить форму" />
<input type = "submit" name = "submitok" value = "OK" />
</ TD>
</ TR>
</ Table>
</ Форма>
</ Body>
</ Html>

На самом деле в этой форме уже встроен один фрагмент кода PHP:

<form method = "post" action = " <? = $ _ SERVER ['PHP_SELF']?> ">

Обратите внимание на атрибут действия. В привычном шаблоне проектирования, который я называл многоцелевыми страницами в предыдущих статьях, мы заставляем форму отправляться на ту же страницу, содержащую код формы. Наблюдая за переменной PHP $ _POST ['submitok'], которая будет создана с помощью кнопки отправки в этой форме (примечание name = "submitok" в теге), наш сценарий сможет обрабатывать отправку формы, а также отображение самой формы.

Мы также используем относительно новую форму синтаксиса для вывода переменной $ _SERVER ['PHP_SELF']. Если вы не знакомы с этим синтаксисом, позвольте мне уточнить, что <? = Expression ?&gt; Функционально идентично <? Php echo expression ; ?>. Таким образом, в этом случае мы могли бы вместо этого написать следующее:

<form method = "post" action = &quot;<? php echo $ _SERVER ['PHP_SELF'];?>">

Теперь, когда у нас есть код для нашей формы, мы можем перейти к написанию полного сценария регистрации.

Сценарий регистрации

Если вы привыкли писать веб-сайты на основе баз данных, сценарий регистрации должен показаться довольно простым. Сначала нам нужно написать пару фрагментов кода, которые будут выполнять общие функции, такие как подключение к базе данных, в которой будут храниться имена пользователей и пароли для сайта. Эти фрагменты будут иметь вид функций PHP, хранящихся во включаемых файлах. Мы будем использовать один включаемый файл для размещения функций, связанных с базой данных (db.php), а другой - для хранения более общих функций (common.php).

Во-первых, вот код для db.php:

<? php // db.php $ dbhost = " localhost "; $ dbuser = " пользователь "; $ dbpass = " пароль "; function dbConnect ($ db = "") {global $ dbhost, $ dbuser, $ dbpass; $ dbcnx = @mysql_connect ($ dbhost, $ dbuser, $ dbpass) или die («База данных сайта не работает.»); if ($ db! = "" и! @mysql_select_db ($ db)) die ("База данных сайта недоступна."); вернуть $ dbcnx; }?>

Определенную здесь функцию dbConnect можно вызывать с аргументом или без него, потому что мы присвоили значение по умолчанию ("") аргументу $ db в объявлении функции. Функция начинается с подключения к серверу MySQL с использованием переменных $ dbhost, $ dbuser и $ dbpass в верхней части файла ( вам необходимо установить для них соответствующие значения для вашего сервера ), а затем, если имя базы данных было учитывая, что выбирает эту базу данных. При условии, что все происходит без ошибок, возвращается ссылка на соединение с базой данных.

Второй включаемый файл, common.php, также содержит одну функцию:

<? php // ошибка функции common.php ($ msg) {?> <html> <head> <script language = "JavaScript"> <! - alert (&quot;<? = $ msg?>"); history.back (); // -> </ script> </ head> <body> </ body> </ html> <? выход; }?>

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

Избавившись от этих скучных деталей, теперь вы можете обратить свое внимание на сценарий регистрации (signup.php). Сценарий начинается с загрузки двух включаемых файлов, которые мы только что написали:

<? php // signup.php include 'common.php'; включите 'db.php';

Это предполагает, что рассматриваемые файлы доступны по пути включения. Рассмотрим, например, следующий путь включения, который я использую в своем файле php.ini:

include_path = ".; c: php4pear; d: wwwphpinclude"

На сервере Unix это может выглядеть так:

include_path = ".: / usr / local / php / lib / php: / home / kyank / phpinclude"

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

Затем скрипт проверяет наличие переменной $ _POST ['submitok'], которая указывает на то, что форма регистрации была отправлена. Если переменная не найдена, сценарий отображает форму из предыдущего раздела для заполнения пользователем:

if (! isset ($ _ POST ['submitok'])): // Показать форму регистрации пользователя?> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http: // www .w3.org / TR / xhtml1 / DTD / xhtml1-transitional.dtd "> <html xmlns =" ​​http://www.w3.org/1999/xhtml "> <head> <title> Регистрация нового пользователя </ title > ...

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

mysql> CREATE TABLE user (-> ID INT PRIMARY KEY AUTO_INCREMENT, -> userid VARCHAR (100) UNIQUE NOT NULL, -> пароль CHAR (16) NOT NULL, -> полное имя VARCHAR (100) NOT NULL, -> электронная почта VARCHAR ( 100) НЕ NULL, -> отмечает ТЕКСТ);

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

Итак, возвращаясь к сценарию, когда обнаружена переменная $ submit, сценарию необходимо подготовиться к вставке новой записи в базу данных с помощью функции dbConnect из db.php:

<? php else: // Процесс отправки регистрации dbConnect ('session');

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

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

if ($ _POST ['newid'] == '' или $ _POST ['newname'] == '' или $ _POST ['newemail'] == '') {error ('Одно или несколько обязательных полей были оставлены пустыми) . \ n '.' Пожалуйста, заполните их и попробуйте снова. '); }

Затем сценарий должен определить, присутствует ли идентификатор, выбранный пользователем, в базе данных, и в этом случае пользователь должен будет выбрать новый идентификатор. Обработка этого запроса несколько необычна, так как мы выбираем одно значение (количество записей с совпадающими идентификаторами пользователя), которое практически будет равно 0 или 1. Поскольку существует только одно значение, нет необходимости циклически просматривать результат задавать. Вместо этого мы используем функцию mysql_result для извлечения значения первого столбца (индекс 0) первой строки (индекс 0):

// Проверка существующего пользователя с новым идентификатором $ sql = "SELECT COUNT (*) ОТ пользователя WHERE userid = '$ _POST [newid]'"; $ result = mysql_query ($ sql); if (! $ result) {error ('Произошла ошибка базы данных при обработке вашего'. 'представления. \ nЕсли эта ошибка сохраняется, пожалуйста,'. 'contact [email protected] .'); } if (@mysql_result ($ result, 0,0)> 0) {error ('Пользователь уже существует с выбранным вами идентификатором пользователя. \ n'. 'Пожалуйста, попробуйте другой.'); }

Не забудьте изменить адрес электронной почты в сообщении об ошибке!

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

Это эффективный метод проверки правильности ввода адреса; однако в практической системе вы можете получить много «плохих» записей в базе данных. Чтобы исправить это, одним из решений было бы добавить два столбца в базу данных пользователей. Первый будет содержать метку времени, когда пользователь был создан. Вторым будет логическое (true / false) значение, которое изначально будет установлено в false и будет установлено в true при первом входе пользователя в систему. Затем можно написать сценарий, который будет запускаться раз в неделю в качестве автоматизированной задачи ( например, используя cron) для удаления любых записей для пользователей, которые зарегистрировались более недели назад и еще не вошли в систему. На практике это будут записи с недействительными адресами электронной почты, пароли которых никогда не доходили до их пользователей.

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

$ newpass = substr (md5 (time ()), 0,6);

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

Наконец, скрипт выполняет вставку базы данных:

$ sql = "INSERT INTO user SET userid = '$ _POST [newid]', пароль = PASSWORD ('$ newpass'), полное имя = '$ _POST [newname]', электронная почта = '$ _POST [newemail]', notes = '$ _POST [newnotes] "; ошибка if (! mysql_query ($ sql)) ('Ошибка обработки базы данных при обработке вашего представления'. '. \ nЕсли эта ошибка сохраняется, пожалуйста,'. 'contact [email protected] .');

Еще раз измените адрес электронной почты в сообщении на свой собственный.

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

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

// Отправить новый пароль человеку. $ message = "G'Day! Ваша личная учетная запись для веб-сайта проекта была создана! Чтобы войти в систему, перейдите по следующему адресу: http://www.example.com/. Ваш личный логин и пароль: userid: $ _POST [newid] пароль: $ newpass Вы не застряли с этим паролем! Вы можете изменить его в любое время после входа в систему. Если у вас есть какие-либо проблемы, не стесняйтесь обращаться ко мне по адресу < you @ example. com >. - Ваше имя Ваш сайт для веб-мастеров "; mail ($ _ POST ['newemail'], "Ваш пароль для вашего сайта ", $ message, "От: Ваше имя < [email protected] >");

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

Наконец, скрипт выводит HTML-код для страницы, которую пользователь увидит при успешной регистрации:

?> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> Регистрация завершена </ title> <meta http-equ = "Content-Type" content = "text / html; charset = iso- 8859-1 "/> </ head> <body> <p> <strong> Регистрация пользователя прошла успешно! </ Strong> </ p> <p> Ваш идентификатор пользователя и пароль были отправлены на <strong> <? = $ _ POST [newemail]?> </ strong> - адрес электронной почты, который вы указали в регистрационной форме. Чтобы войти в систему, нажмите <a href="index.php"> здесь </a>, чтобы вернуться на страницу входа, и введите свой новый личный идентификатор пользователя и пароль. </ P> </ body> </ html> <? php endif; ?>

Обратите внимание, что это сообщение указывает пользователю на index.php как «страницу входа» для сайта. Это предполагает, что весь ваш сайт потребует регистрации для доступа, за единственным исключением самой страницы регистрации. Если вы намереваетесь защитить только определенную область вашего сайта, вам, вероятно, следует изменить это сообщение, чтобы направить пользователя в защищенную паролем область сайта. Вам не нужно направлять их на определенную страницу входа; как мы увидим во второй части этой статьи, любая защищенная страница сайта будет запрашивать доступ, если пользователь еще не вошел в систему.

Когда процесс регистрации готов к работе, мы заложили основу для веб-сайта, который требует от пользователей регистрации для доступа. Теперь пользователи могут создать учетную запись для себя и иметь ее мгновенно доступной, без вмешательства со стороны администратора сайта. Автоматически генерируя исходный пароль для каждого нового пользователя и отправляя его по электронной почте по адресу, который они указали при регистрации, вы можете быть уверены, что адрес электронной почты, предоставленный каждым пользователем, действителен. Это также открывает доступ к удобной функции «напишите мне мой забытый пароль», если вы решите, что это уместно.

Часть вторая: управление доступом

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

Сессии PHP

Если вы никогда не пользовались поддержкой сессий, которые были добавлены в PHP в версии 4.0, вы можете быть немного неясными в вопросе о том, что такое сессии на самом деле. Несмотря на сложное название, сеансы - действительно простой способ создания переменных, которые остаются на время пребывания пользователя на вашем сайте. Если не сконфигурировано иное, сеанс PHP работает, автоматически устанавливая cookie в браузере пользователя, содержащий идентификатор сеанса, который представляет собой длинную строку букв и цифр, которая служит для однозначной идентификации этого пользователя на вашем сайте на время посещения. Затем браузер отправляет этот файл cookie вместе с каждым запросом на страницу с вашего сайта, чтобы PHP мог использовать его для определения того, к какому из множества выполняемых сеансов относится данный запрос. Используя набор временных файлов, хранящихся на веб-сервере, PHP отслеживает переменные, которые были зарегистрированы в каждом сеансе, и их значения.

Прежде чем вы сможете использовать элегантные функции управления сеансами в PHP, вы должны убедиться, что соответствующий раздел вашего файла php.ini настроен правильно. Если вы используете сервер, принадлежащий вашему веб-хосту, вероятно, можно с уверенностью предположить, что это было сделано для вас. В противном случае откройте файл php.ini в текстовом редакторе и найдите раздел с пометкой [Session]. Под ним вы найдете двадцать несколько вариантов, начинающихся со слова «сессия». Большинство из них просто отлично, если оставить как есть, но вот несколько важных, которые вы хотите проверить:

session.save_handler = файлы session.save_path = "C: WINDOWSTEMP" session.use_cookies = 1

session.save_path сообщает PHP, где создавать временные файлы, используемые для отслеживания сессий. Это должен быть каталог, который существует в системе, иначе вы получите ужасные сообщения об ошибках при попытке создать сеанс на одной из ваших страниц. Под Unix / tmp является популярным выбором. В Windows вы можете использовать C: WINDOWSTEMP или другой каталог, если хотите (я использую D: PHPSESSIONS). После внесения этих изменений перезапустите программное обеспечение веб-сервера, чтобы изменения вступили в силу.

Теперь вы готовы начать работу с сессиями PHP. Прежде чем перейти к сценарию контроля доступа, давайте быстро рассмотрим наиболее распространенные функции управления сессиями в PHP. Чтобы заставить PHP искать идентификатор сеанса или начать новый сеанс, если ничего не найдено, вы просто вызываете session_start. Если при вызове этой функции найден существующий идентификатор сеанса, PHP восстанавливает переменные, принадлежащие сеансу.

session_start ();

Чтобы сообщить PHP, что вы хотите, чтобы конкретная переменная была сохранена в текущем сеансе, чтобы она была доступна для других сценариев, запущенных в том же сеансе, просто установите переменную в массиве $ _SESSION. Например, следующее будет хранить переменную с именем $ _SESSION ['pwd'] в текущем сеансе:

$ _SESSION ['pwd'] = значение ;

Чтобы удалить переменную из текущего сеанса, вы просто используете функцию unset PHP:

снята с охраны ($ _ SESSION [ 'PWD']);

Наконец, если вы хотите завершить текущий сеанс, удалив все зарегистрированные переменные в процессе, вы можете очистить массив $ _SESSION и затем использовать session_destroy:

$ _SESSION = array (); session_destroy ();

Для получения более подробной информации об этих и других функциях управления сессиями в PHP см. Соответствующий раздел Руководства по PHP: Функции обработки сеансов ,

Скрипт контроля доступа

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

При первом запросе защищенной страницы пользователь еще не введет свои данные для входа. Сценарий обнаруживает это и запрашивает у пользователя имя пользователя и пароль с формой входа вместо отображения запрошенной страницы. Когда эта форма отправлена, страница перезагружается, на этот раз с указанием имени пользователя и пароля. Сценарий видит, что были указаны данные для входа, и регистрирует их как переменные сеанса, чтобы они оставались доступными до конца посещения пользователя. Наконец, скрипт проверяет базу данных, чтобы убедиться в правильности комбинации имени пользователя и пароля. Если это так, отображается запрашиваемая страница. В противном случае отображается сообщение «Отказано в доступе» со ссылкой, предлагающей пользователю повторить попытку входа.

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

<? php include 'accesscontrol.php'; ?>

Теперь, когда цель ясна, я расскажу вам код для accesscontrol.php. Начните с включения двух ваших удобных включаемых файлов:

<? php // accesscontrol.php include_once 'common.php'; include_once 'db.php';

Я использую include_once здесь вместо include на тот случай, если основной файл также использует эти файлы include. Например, если файл common.php был включен дважды, PHP выдаст предупреждение о том, что функция ошибки была объявлена ​​дважды.

Затем я вызываю session_start, чтобы либо начать новый сеанс (если это первая страница в посещении пользователя), либо загрузить переменные, принадлежащие текущему сеансу пользователя.

session_start ();

На этом этапе данные для входа в систему пользователя должны быть доступны независимо от того, были ли они просто отправлены из формы входа (в массиве $ _POST) или сохранены в сеансе пользователя (в массиве $ _SESSION). Поэтому в качестве первого шага сценарий должен извлечь учетные данные для входа из массива $ _POST или $ _SESSION:

$ uid = isset ($ _ POST ['uid'])? $ _POST ['uid']: $ _SESSION ['uid']; $ pwd = isset ($ _ POST ['pwd'])? $ _POST ['pwd']: $ _SESSION ['pwd'];

Эти две строки используют удобный (если запутанный) синтаксис, называемый тернарным оператором , который принимает эту форму:

состояние ? value_if_true: value_if_false

Если условие истинно, выражение будет равно value_if_true . Если нет, он будет равен value_if_false .

Таким образом, если вы сравните это с первой строкой выше, вы увидите, что если в массиве $ _POST есть значение 'uid' (isset ($ _ POST ['uid'])), значение $ uid будет установлено равным значению $ _POST ['uid']. Если нет, ему будет присвоено значение $ _SESSION ['uid']. То же самое происходит с созданием $ pwd из массива $ _POST или $ _SESSION.

Если вам действительно не нравится троичный оператор, вот как вы можете сделать то же самое с операторами if:

if (isset ($ _ POST ['uid']) {$ uid = $ _POST ['uid'];} else {$ uid = $ _SESSION ['uid'];} if (isset ($ _ POST ['pwd']) ) {$ pwd = $ _POST ['pwd'];} else {$ pwd = $ _SESSION ['pwd'];}

Как вы можете видеть, троичный оператор может сэкономить много печатать, если вы можете разобраться с этим!

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

if (! isset ($ uid)) {?> <! DOCTYPE html PUBLIC "- // W3C / DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd "> <html xmlns =" ​​http://www.w3.org/1999/xhtml "> <head> <title> Пожалуйста, войдите в систему для доступа </ title> <meta http-эквивалента =" Content-Type "content =" text / html; charset = iso-8859-1 "/> </ head> <body> <h1> Требуется вход в систему </ h1> <p> Вы должны войти в систему, чтобы получить доступ к этой области сайта. Если вы не являетесь зарегистрированным пользователем, <a href="signup.php"> нажмите здесь </a>, чтобы подписаться на мгновенный доступ! </ P> <p> <form method = "post" action = &quot;<? = $ _ SERVER ['PHP_SELF']?> "> Идентификатор пользователя: <input type =" text "name =" uid "size =" 8 "/> <br /> Пароль: <input type =" password "name =" pwd "SIZE =" 8 "/> <br /> <input type =" submit "value =" Войти в систему "/> </ form> </ p> </ body> </ html> <? php exit; }

Когда представленная выше форма входа в систему будет отправлена, страница будет перезагружена, на этот раз с переменными $ uid и $ pwd, установленными для идентификатора пользователя и пароля. Следующим шагом в соответствии с приведенной выше блок-схемой является регистрация их в качестве переменных сеанса, обеспечивающих их доступность для всех других защищенных страниц, которые пользователь просматривает во время этого посещения. Обратите внимание, что на данный момент сценарий по-прежнему не знает, действительны ли введенные ID пользователя и пароль. Я объясню, почему сценарий делает вещи в этом порядке в ближайшее время.

$ _SESSION ['uid'] = $ uid; $ _SESSION ['pwd'] = $ pwd;

Чтобы выяснить, действительны ли идентификатор пользователя и пароль, скрипт ищет в базе данных совпадающие записи. В запросе SELECT я закодировал переменную $ pwd, используя функцию PASSWORD MySQL, чтобы сопоставить ее с сохраненным паролем, который также закодирован. Обязательно используйте здесь свое имя базы данных - я назвал мои сеансы - и свой адрес электронной почты в сообщении об ошибке.

dbConnect (" сеансы "); $ sql = "SELECT * FROM пользователя WHERE userid = '$ uid' И пароль = PASSWORD ('$ pwd')"; $ result = mysql_query ($ sql); if (! $ result) {error ('Произошла ошибка базы данных при проверке ваших регистрационных данных'. '. \ nЕсли эта ошибка сохраняется, пожалуйста,'. 'contact [email protected] .'); }

Если в базе данных не найдено подходящих строк, предоставленные данные для входа неверны. Сценарий проверяет это с помощью функции mysql_num_rows и отображает сообщение, запрещающее доступ к сайту и предлагающее пользователю повторить попытку входа. Чтобы сделать это возможным, сценарий также отменяет регистрацию двух переменных сеанса ($ _SESSION ['uid'] и $ _SESSION ['pwd']), так что при следующем запуске сценария будет отображаться форма входа. Поскольку переменные были зарегистрированы ранее в сценарии, прежде чем проверять их действительность, сценарию не нужно проверять, зарегистрированы ли они, прежде чем пытаться отменить их регистрацию.

if (mysql_num_rows ($ result) == 0) {unset ($ _ SESSION ['uid']); снята с охраны ($ _ SESSION [ 'PWD']); ?> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> Доступ запрещен </ title> <meta http-эквивалент = "Тип контента" content = "text / html; charset = iso- 8859-1 "/> </ head> <body> <h1> Доступ запрещен </ h1> <p> Ваш идентификатор пользователя или пароль неверны, или вы не зарегистрированы на этом сайте. Чтобы снова войти в систему, нажмите <a href=&quot;<?=$_SERVER['PHP_SELF']?> "> здесь </a>. Чтобы зарегистрироваться для мгновенного доступа, нажмите <a href="signup.php"> здесь </a>. </ P> </ body> </ html> <? Php exit; }

Теперь, когда данные для входа сохранены в виде переменных сеанса и проверены на правильность, скрипт может безопасно предоставить доступ к запрашиваемой странице. Последнее, что я делаю перед завершением accesscontrol.php и передачей управления обратно на защищенную страницу, это получение полного имени пользователя, которое доступно из набора результатов MySQL, созданного ранее. Его не нужно регистрировать как переменную сеанса, поскольку он будет снова извлекаться каждой защищенной страницей с использованием значений «uid» и «pwd», хранящихся в сеансе.

$ username = mysql_result ($ result, 0, 'fullname'); ?>

Это завершает accesscontrol.php, а вместе с ним и систему контроля доступа! Повторим, что теперь любая страница может быть ограничена доступом только для членов, просто включив accesscontrol.php вверху скрипта. Вот очень простой пример, который использует переменную $ username для отображения имени пользователя:

<? php include 'accesscontrol.php'; ?> <! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> Страница, предназначенная только для членов </ title> <meta http-lim = "Тип контента" content = "text / html; charset = iso-8859-1 "/> </ head> <body> <p> Добро пожаловать, <? = $ username?>! Вы вошли в раздел только для членов сайта. Вы не чувствуете себя особенным? </ P> </ body> </ html>

Заворачивать

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

Однако есть еще несколько вещей, которые нужно добавить:

  • Страница, на которой пользователи могут изменить свой пароль, адрес электронной почты и любые другие параметры и информацию, которую вы хотите сохранить в своих профилях пользователей. Это, очевидно, будет страница только для членов, и переменная $ uid должна пригодиться при определении, какую запись обновить в базе данных.
  • Функция «отправить мне мой пароль», которая позволит пользователю забыть данные для входа в систему по электронной почте. Конечно, вы не можете хранить пароли, зашифрованные с использованием функции ПАРОЛЯ MySQL, если вы хотите реализовать эту функцию (поскольку ПАРОЛЬ - это односторонняя операция, которая не может быть отменена). Если вы хотите большей безопасности, вы можете реализовать одну из тех схем, где пользователь выбирает вопрос во время регистрации, на который он или она должен ответить, чтобы восстановить забытый пароль.
  • Доступ только для членов к файлам, отличным от HTML. Поскольку PHP в равной степени способен отправлять HTML и двоичную информацию, вы можете создать сквозной скрипт, который будет извлекать запрошенный файл, только если в текущем сеансе будет найдена правильная комбинация $ uid / $ pwd.

Это всего лишь несколько идей, с которых можно начать, я уверен, что вы можете придумать еще несколько интересных. Я оставлю их для вас, чтобы выполнить как упражнение, но если вы застряли, не стесняйтесь зайти к Форумы SitePoint.com просить помощи!

Если вам понравилось читать этот пост, вам понравится Обучающийся ; место, чтобы узнать новые навыки и приемы у мастеров. Участники получают мгновенный доступ ко всем электронным книгам и интерактивным онлайн-курсам SitePoint, таким как PHP и MySQL Веб-разработка для начинающих ,

SERVER ['PHP_SELF']?
SERVER ['PHP_SELF']?
Если вы не знакомы с этим синтаксисом, позвольте мне уточнить, что <?
Gt; Функционально идентично <?
Php echo $ _SERVER ['PHP_SELF'];?
Php ($ msg) {?
Quot;<?
Msg?
Back (); // -> </ script> </ head> <body> </ body> </ html> <?
Выход; }?