[11:50]
[🔒]
✪
Статья
PHP для начинающих - Сессия
Категории: Программир.; Интернет, сети, web;
Изначально подразумевали, что по этому протоколу будет только HTML передаваться, отсель и название, а сейчас чего только не отправляют(•_ㅅ_•)=^.^=
1
2
3
4
5
GET / HTTP/1.1
Host: example.com
Accept: text/html
...пустая строка...
Request
6
HTTP/1.1 200 OK
Content-Length: 1983
Content-Type: text/html; charset=utf-8
...
Response
Т.е. если украсть cookie из вашего браузера, то можно будет зайти на вашу страничку в facebook от вашего имени Не пугайтесь, так сделать нельзя, по крайней мере с facebook, и дальше я вас научу как можно защититься от данного вида атаки на ваших пользователей.
POST /login/ HTTP/1.1
login=Username&password=Userpass
Set-Cookie: KEY=VerySecretUniqueKey
Cookie: KEY=VerySecretUniqueKey
Как можно заметить, заголовки отправляемые браузером (Request Headers) и сервером (Response Headers) отличаются, хотя есть и общие и для запросов и для ответов (General Headers)
Я надеюсь, у вас уже установлен PHP на компьютере, т.к. дальше я буду приводить примеры, и их надо будет запускать
Вот вам статейка на тему PHP is meant to die, или вот она же на русском языке, но лучше отложите её в закладки “на потом”.
session_start();
php -S 127.0.0.1:8080
Set-Cookie: PHPSESSID=dap83arr6r3b56e0q7t5i0qf91; path=/
PHPSESSID – имя сессии по умолчанию, регулируется из конфига php.ini директивой session.name, при необходимости имя можно изменить в самом конфигурационном файле или с помощью функции session_name()
$_SESSION['time'] = date("H:i:s");
echo $_SESSION['time'];
if (!isset($_SESSION['time'])) {
}
В вашей конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах вашей системы – вызовите функцию sys_get_temp_dir() и узнайте где это потаённое место.
time|s:8:"16:19:51";
time|s:13:"\m/ (@.@) \m/";
Напишите свою функцию, аналогичную по функционалу session_decode(), вот вам тестовый набор данных для сессии (для решения знаний регулярных выражений не требуется), текст для преобразования возьмите из файла вашей текущей сессии:
01
02
03
04
05
06
07
08
09
10
11
12
$_SESSION['integer var'] = 123;
$_SESSION['float var'] = 1.23;
$_SESSION['octal var'] = 0x123;
$_SESSION['string var'] = "Hello world";
$_SESSION['array var'] = ['one', 'two', [1,2,3]];
$object = new stdClass();
$object->foo = 'bar';
$object->arr = ['hello', 'world'];
$_SESSION['object var'] = $object;
$_SESSION['integer again'] = 42;
javascript:(function(){document.cookie='PHPSESSID=dap83arr6r3b56e0q7t5i0qf91;path=/;';window.location.reload();})()
$_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
if ($_SESSION['ua'] != $_SERVER['HTTP_USER_AGENT']) {
die('Wrong browser');
Ключевое слово в предыдущем абзаце похоже, в реальных проектах cookies уже давно «бегают» по HTTPS протоколу, таким образом никто их не сможет украсть без физического доступа к вашему компьютеру или смартфону
Добавьте в код проверку на IP пользователя, если проверка не прошла – удалите скомпрометированную сессию.
$_SESSION['id'] = 42;
Задайте в вашем браузере произвольное значение куки с именем PHPSESSID, пусть это будет 1234567890, обновите страницу, проверьте, что у вас создался новый файл sess_1234567890
Отдельно замечу, что не надо писать собственные обработчики сессий для redis и memcache – когда вы устанавливаете данные расширения, то вместе с ними идут и соответствующие обработчики, так что RTFM наше всё. Ну и да, обработчик нужно указывать до вызова session_start() ;)
Реализуйте SessionHandlerInterface для хранения сессии в MySQL, проверьте, работает ли он.Это задание со звёздочкой, для тех кто уже познакомился с базами данных.
Измените значение директивы session.gc_divisor так, чтобы сборщик мусора запускался каждый раз, проверьте что это так и происходит.
Cannot send session cookie – headers already sent byCannot send session cache limiter – headers already sent
Cannot send session cache limiter – headers already sent
echo str_pad(' ', ini_get('output_buffering'));
Во второй строке странная “магия” – это фокус с буфером вывода, я ещё расскажу о нём в одной из следующих статей, пока считайте это лишь строкой длинной в 4096 символов, в данном случае – это всё пробелы
раньше времени, это может быть пробел до символов в одном из подключаемых файлов, и ладно если это пробел, может быть и какой-нить непечатный символ вроде BOM, так что будьте внимательны, и вас сия зараза не коснется (как-же, … гомерический смех).
Для проверки полученных знаний, я хочу, чтобы вы реализовали свой собственный механизм сессий и заставили приведенный код работать:
7
require_once 'include/sess.php';
sess_start();
if (isset($_SESS["id"])) {
echo $_SESS["id"];
} else {
$_SESS["id"] = 42;
Для осуществления задуманного вам потребуется функция register_shutdown_function()
Комментарии: 1
Много интересных вещей, кое-что из описанного использовал в данном приложении
Чтобы написать комментарий нужно, зарегистрироваться
Голосования и тесты: 2