Similar presentations:
Получение хеша. Cookies и сессии, авторизация на сайте, организация доступа к разделам сайта при помощи сессии
1.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Поговорим о:
Получение хеша. Cookies и сессии, авторизация
на сайте, организация доступа к разделам сайта
при помощи сессии, редиректы на PHP.
1
2.
ОСНОВЫ PHPОсновы
Основы PHP
PHP
Урок
Урок
№12
№10
№4
УрокУрок
№4
Получение хеша
string md5 ( string str [, bool raw_output] ) - вычисляет MD5 хэш
string sha1 ( string str [, bool raw_output] ) - возвращает хэш строки
строки str используя алгоритм MD5 RSA Data Security, Inc. и
возвращает этот хэш. Хэш представляет собой 32-значное
шестнадцатеричное число. Если необязательный аргумент
raw_output имеет значение TRUE, то возвращается бинарная строка
из 16 символов.
str, вычисленный по алгоритму US Secure Hash Algorithm 1. Хэш
представляет собой 40-разрядное шестнадцатиричное число. Если
необязательный аргумент raw_output имет значение TRUE, хэш
возвращается в виде двоичной строки из 20 символов.
$password = 'apple';
$password = 'apple';
if (md5($password) === '1f3870be274f6c49b3e31a0c6728957f'){
echo "Пароль верный!";
}
string md5_file ( string filename [, bool raw_output] ) – возвращает
MD5 хэш файла, имя которого задано аргументом filename
if (sha1($password) === '6099a566a619528259db5aa8d7a5aa2d4122259a'){
echo "Пароль верный!";
}
string sha1_file ( string filename [, bool raw_output] ) – возвращает SHA1
хэш файла, имя которого задано аргументом filename
1
2
3.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Управление сеансами
Так как протокол HTTP не имеет встроенного способа поддержки состояний между двумя транзакциями, то с его помощью
невозможно установить что идущие запросы исходят от какого то одного клиента. Соответственно он не годится для управления
сеансами.
В PHP есть свой механизм сессий, а так же суперглобальный массив - $_SESSION
Для управления сеансами используется уникальный идентификатор сеанса – зашифрованное случайное число, к примеру:
PHPSESSID = ac8ed6e8e0b78d6f6cfc7929c87fecb5
Он генерируется PHP и сохраняется на стороне клиента на протяжении всего сеанса либо в cookie-наборе, либо передается в
составе URL.
Идентификатор сеанса выполняет роль ключа и обеспечивает возможность регистрации и получения доступа к специальным
переменным сеанса, которые хранятся на сервере – сессионному суперглобальному массиву $_SESSION.
Основные этапы реализации простых сеансов:
• Запуск сеанса;
• Регистрация переменных сеанса;
• Использование переменных сеанса;
• Разрегистрация переменных и закрытие сеанса.
3
4.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Запуск сессии
Прежде чем нам станут доступны возможности, предоставляемые сессиями, нужно запустить саму сессию
и для этого существует два способа:
1. Поместить в начало каждого сценария вызов функции - session_start();
Эта функция проверяет, находитесь ли Вы все еще в текущем сеансе?
Если нет, то она создает идентификатор сеанса, обеспечивающий доступ к массиву $_SESSION.
Вызов session_start лучше помещать в начало всех сценариев, так как если он будет по коду
ниже чем Вы уже отдаете какую-либо информацию в браузер – возникнет ошибка.
2.
Так же можно задать установки PHP для автоматического запуска сессии – session.auto_start в файле
php.ini. Но тогда Вы не сможете использовать объекты в качестве переменных сеанса, а так же
возможны проблемы с переносом на хостинг, где Вам не дадут такого права.
4
5.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Регистрация и использование переменных сессии
Для регистрации переменной в суперглобальном сессионном массиве достаточно
присвоить этому массиву какой-либо элемент:
$_SESSION['authorized'] = false;
Мы можем напрямую обращаться к элементам массива $_SESSION. Например, проверка
авторизации будет выглядеть примерно так:
session_start();
if ($_SESSION['authorized']<>1) {
header("Location: /login.php");
exit;
}
5
6.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Окончание сессии
После окончания работы с переменной сеанса её можно разрегистрировать:
Unset($_SESSION['authorized'] );
Для разрегистрации всех переменных сессии сразу:
$_SESSION = array();
После того как были разрегистрированны все переменные сеанса, можно вызвать отчистку
идентификатора сеанса:
session_destroy();
6
7.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Счётчик посещений одной страницы в рамках одной сессии
Простой пример использования сессий без Cookies:
<?
session_name("test");
session_start();
$_SESSION['count'] = @$_SESSION['count'] + 1;
//зачем тут @? Напишите подругому.
?>
<h2>Счетчик</h2>
В текущей сессии работы с браузером Вы открыли эту страницу
<?=$_SESSION['count']?> раз(а).
Закройте браузер, чтобы обнулить этот счетчик.
<a href="#">Нажмите сюда для обновления страницы!</a>
7
8.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Что такое cookies
Cookie-набор – это небольшой фрагмент информации, который сценарий сохраняет на клиентском компьютере (в
браузере). Чтобы установить cookie на клиентской машине, нужно ему отправить HTTP-заголовок, содержащий данные
такого формата:
Set-Cookie: NAME=VALUE; [expires=DATE;] [path=PATH;] [domain=DOMAIN_NAME;] [secure]
В результате будет создан cookie-набор с именем NAME и значением VALUE.
Остальные параметры не обязательны, но часто используются:
Expires – дата истечения срока действия данной cookies. Если дату не поставить, то cookies будет вечной, пока её не
удалят вручную.
Path и domain – применяются вместе для определения одного или нескольких URL, к которым относится данный cookiesнабор.
Secure – значит что cookies не должен пересылаться через простое HTTP соединение.
Когда браузер соединяется с URL, он сначала просматривает cookies-наборы, хранящиеся на локальной машине. Если
находит какие-то относящиеся к текщему URL – то передает их серверу.
8
9.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Установка cookie
Для установки Cookies используется функция SetCookie().
// Устанавливаем Cookie до конца сессии:
SetCookie("Test","Value");
Для этой функции можно указать шесть параметров,
один из которых является обязательным:
• name - задает имя (строк), закрепленное за Cookie;
• value - определяет значение переменной (строка);
• expire - время "жизни" переменной (целое число).
Если данный параметр не указать, то Cookie будут
"жить" до конца сессии, то есть до закрытия
браузера. Если время указано, то, когда оно наступит,
Cookie самоуничтожится.
• path - путь к Cookie (строка);
• domain - домен (строка). В качестве значения
устанавливается имя хоста, с которого Cookie был
установлен;
• secure - передача Cookie через защищенное HTTPSсоединение.
// Устанавливаем Cookie на один час после установки:
SetCookie("My_Cookie","Value",time()+3600);
При использовании Cookies нужно знать, что они должны устанавливаться до первого
вывода информации в браузер (например, оперетором echo или выводом какой-либо
функции). Поэтому желательно устанавливать Cookies в самом начале скрипта. Cookies
устанавливаются с помощью определенного заголовка сервера, а если скрипт выводит
что-либо, то это означает, что начинается тело документа. В результате Cookies не будут
установлены и может быть выведено предупреждение.
Для проверки успешности установки Cookies можно использовать такой метод:
// Устанавливаем Cookie до конца сессии:
// В случае успешной установки Cookie, функция SetCookie возвращает TRUE:
Обычно используются только три первые параметра.
if (SetCookie("Test","Value")) echo "<h3>Cookies успешно установлены!</h3>";
9
10.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Чтение значений Cookies
Получить доступ к Cookies и их значениям достаточно просто. Они хранятся в суперглобальных массивах и $_COOKIE и $HTTP_COOKIE_VARS.
Доступ к значениям осуществляется по имени установленных Cookies, например:
echo $_COOKIE['my_cookie'];
Пример установки Cookie и последующего его
чтения:
// Устанавливаем Cookie 'test' со значением 'Hello'
// на один час:
setcookie("test","Hello",time()+3600);
// Проверяем, был ли уже установлен Cookie 'Mortal',
// Если да, то читаем его значение,
// И увеличиваем значение счетчика обращений к странице:
if (isset($_COOKIE['Mortal'])) $cnt=$_COOKIE['Mortal']+1;
else $cnt=0;
// Устанавливаем Cookie 'Mortal' зо значением счетчика,
// С временем "жизни" до 18/07/29,
// То есть на очень долгое время:
// При следующем запросе скрипта вывод 'Hello':
setcookie("Mortal",$cnt,0x6FFFFFFF);
echo @$_COOKIE['test'];
// Выводит число посещений (загрузок) этой страницы:
echo "<p>Вы посещали эту страницу <b>".@$_COOKIE['Mortal']."</b> раз</p>";
10
11.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Установка массива Cookies
Мы может установить массив Cookies, используя квадратные скобки в именах
Cookies [], а затем прочитать массив Cookies и значения этого массива:
// Устанавливаем массив Cookies:
setcookie("cookie[1]", "Первый");
setcookie("cookie[2]", "Второй");
setcookie("cookie[3]", "Третий");
// После перезагрузки страницы мы отобразим
// Состав массива Cookies 'cookie':
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br>";
}
}
11
12.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Удаление и проверка Cookies
Стандартный isset($_COOKIE[‘имя_куки'])) вполне может
проверить есть ли такая кука.
Так же можно получить содержимое всего набора для текущего
сеанса:
session_get_cookie_params();
Иногда возникает необходимость удаления Cookies. Сделать это
несложно, необходимо лишь вновь установить Cookie с
идентичным именем и пустым параметром.
Например:
// Удаляем Cookie 'Test':
SetCookie("Test","");
12
13.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Редирект на PHP
В основе редиректа на php лежит использование функции (справка):
header ( string $string [, bool $replace = true [, int $http_response_code ]] )
Где:
$string – строка заголовка;
$replace – необязательный параметр, означающий нужно ли перезаписывать ранее указанный аналогичный
заголовок, отправленный в браузер пользователя (по умолчанию «true»);
$http_response_code – необязательный параметр принудительного задания кода HTTP ответа, если таковой не
был задан в ранее переданном заголовке, и если строка заголовка не пуста. По умолчанию передается код «302
Moved Temporarily» - «временно перемещено».
Пример простого редиректа:
header('Location: http://www.example.com/');
13
14.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Редирект с кодами ответа
Коды HTTP ответа можно задавать принудительно двумя различными способами. Первый способ
следует из спецификации самой функции header, в которой в качестве третьего параметра можно
указывать код статуса HTTP, например:
header( 'Location: http://www.example.com/', true, 301 );
Второй способ принудительной передачи кода HTTP ответа – отправка строки заголовка иного
вида, перед отправкой заголовка «location». В большинстве случаев это:
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://www.example.com/');
Однако, если на Вашем сервере включен режим FastCGI, то строка заголовка со статусом ответа
должна быть несколько иной:
header('Status: 301 Moved Permanently');
header('Location: http://www.example.com/');
14
15.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Php-редирект с условием
Пример редиректа с условием прав пользователя:
Ранее был определен тип текущего пользователя и помещен в
переменную $user_type, далее мы эту переменную проверяем.
if ($user_type == "subscriber") {$redirect_url = "/blog.html";}
elseif ($user_type == "author") {$redirect_url = "/author-panel.html";}
elseif ($user_type == "admin") {$redirect_url = "/admin-panel.html";}
else {$redirect_url = "/registration-form.html";}
switch ($user_type){
case "author": $redirect_url = "/author-panel.html"; break;
case "admin": $redirect_url = "/admin-panel.html"; break;
default: $redirect_url = "/registration-form.html";
}
header('HTTP/1.1 200 OK');
header('Location: http://'.$_SERVER['HTTP_HOST'].$redirect_url);
exit();
ИЛИ
header('HTTP/1.1 200 OK');
header('Location: http://'.$_SERVER['HTTP_HOST'].$redirect_url);
exit();
$redirect_url = array (
"author" => "/author-panel.html",
"admin" => "/admin-panel.html",
"newuser" => "/registration-form.html"
);
header('HTTP/1.1 200 OK');
header('Location:
http://'.$_SERVER['HTTP_HOST'].$redirect_url[$user_type]);
exit();
15
16.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Безопасность при авторизации
2 основные возможные точки взлома в программе авторизации пользователя:
1. Файл на котором происходит сравнение введенных логина/пароля пришедшими из формы попытка подбора пароля с помощью стороннего скрипта;
1.
Файл куда не должны попасть неавторизованные пользователи - попытка обмануть
программу путём вписывания значений переменной $logged_user в адресной строке браузера,
например так:
"http://www.yoursite.ru/secretplace.php?logged_user=hacker"
16
17.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Решение первой проблемы
<?php
session_start();
// полный путь к корневой директории где расположены скрипты
$SERVER_ROOT = "http://localhost/test1/";
// если пользователь пришёл с любой страницы нашего сайта то он вроде наш...
// Переменная $HTTP_REFERER всегда доступна по умолчанию и содержит полный адрес ссылающейся страницы...
// функция eregi() проверяет, начинается ли адрес ссылающейся страницы со значения в переменной $SERVER_ROOT
if(preg_match("/^$SERVER_ROOT/",$_SERVER['HTTP_REFERER'])){
if($_POST['Submit']){
// данные были отправлены формой?
if(($_POST['user_name']=="cleo")&&($_POST['user_pass']=="password")){
$_SESSION['logged_user'] = $_POST['user_name'];
// запоминаем имя пользователя
header("Location: secretplace.php");
// и переправляем его на <секретную> страницу...
exit;
}
}
} ?>
<html><body> Вы ввели неверный пароль! </body></html>
17
18.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Решение второй проблемы
Предположим, у вас есть сайт, где каждый смертный может зарегистрироваться чтобы добавлять
сообщения в форум.
Естественно, в форуме у некоторых пользователей (админов, модераторов), возможностей больше чем у
других, они, например, могут удалять сообщения других пользователей.
Уровень доступа пользователя вы храните в сессии, в переменной $user_status, где $user_status = 10
соответствует полному доступу к системе.
Пришедшему на сайт злоумышленнику достаточно зарегистрироваться штатным образом, а потом дописать
в адресной строке браузера ?user_status=10.
Вот и завёлся у вас на форуме новый админ!
В принципе, любую переменную скрипта можно задать через адресную строку, просто дописав после
полного адреса к скрипту вопросительный знак и название переменной с её значением.
18
19.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Решение второй проблемы
<?php
// открываем сессию
session_start();
/* просто зайти на эту страницу нельзя... Если имя пользователя не зарегистрировано, то перенаправляем его на страницу index.php
для ввода логина и пароля... тут на самом деле можно много чего сделать, например запомнить IP пользователя, и после третьей
попытки получить доступ к файлам, его перекрыть.
*/
if(!isset($_SESSION['logged_user'])){
header("Location: index.php");
exit;
}
?>
<html>
<body>
Привет, <?php echo $_SESSION['logged_user']; ?>, ты на секретной странице!
</body>
</html>
19
20.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
ДЗ
1. Сделать авторизацию на свой сайт в админку.
2. Сделать регистрацию и авторизацию на сайт пользователей (отдельно от
пользователей админки).
3. При всех видах регистрации не хранить в базе данных открытый пароль, а
хешировать его и стравнивать.
20
21.
ОСНОВЫ PHPОсновы PHP
Урок
№10
Урок
№4
Полезные ссылки:
http://www.php.su/articles/?cat=examples&page=070 - подробно про сессию
http://www.webengineer.pro/php-scripts/11-redirekt-sredstvami-php - неплохо про
редирект, есть примеры отложенного редиректа с таймером
21