Всяка PHP сесия има уникален идентификатор, който се получава чрез MD5 хеширане на IP адреса на клиента, текущия дата и час и допълнителен случайно генериран код. За да се поддържат валидни данните в сесията е необх. предаването на нейния идентификатор на всяка поредна заявка, която потребителят реализира. Това може да стане по 2 начина: с парам. в URL и с бисквитка:
При подхода URL параметър, идентификаторът на сесията се добавя като парам. в URL на всеки линк, генериран от приложението:

echo ‘<a href=”index.php?PHP_SESSID=’.
session_id().’”>Нататък</a>’;

Този начин на работа дава алтернативата на из-ползването на бисквитки (ако клиентът ги е забранил например), но е по-лошият избор от гледна точка на сигурността – URL адресите попадат в дневниците на сървъра, могат да се проследят лесно в трафика и така идентифика-торът на сесията става лесна плячка за хакерите. По-добре е да се стимулират потребителите да разрешат използването на бисквитки.
При подхода с Бисквитка на сесията идентификаторът на сесията се записва в бисквит-ка, стандартното име на която е PHPSESSID. Сесията може да бъде управлявана чрез директното манипулиране на нейната бисквитка. За удобство на програмиста PHP предлага и редица ф-ии, свързани със сесията, които не изискват директна работа с нейната бисквитка:

  • session_start() – създава нова сесия или продължава действието на текущата (ако има валиден идентификатор, предаден в рамките на текущата заявка);
  • session_id(string id) – задава или връща идентификатора на текущата сесия;
  • session_name(string name) – задава или връща името на текущата сесия;
  • session_get_cookie_params()– връща като масив текущите стойности на параметрите path, lifetime, do-main и secure за текущата сесия;
  • session_set_cookie_params() – задава нови текущи стойности на параметрите path, lifetime, domain и secure за текущата сесия.

Програмистът има възможност да поставя в сесията неограничен бр. пром. от произволен тип. За целта те трябва да бъдат деф. като ел. на масива $_SESSION. Извличането им от сесията става пак от същия масив, като за индекс се използва името на променливата.
Следв. пр. демонстрира създаването на потребителска сесия след въвеждането на коректни име и парола, както и последващият контрол на достъпа до страниците на web приложението:

class UserControl {
function __construct() {
session_start();
}

function login( $username, $password )
{
$_SESSION = array();
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(),
”, time()-86400, ‘/’);
}
$userid = $this->checkUser($username, $password);
if ( $userid > 0 )
{
$_SESSION['userid'] = $userid;
return true;
}
else
return false;
}
function authorize()
{
if( isset($_SESSION['userid']) &&  $_SESSION['userid'] != ” )
return true;
else
return false;
}
}
. . .
<h1>Домашна страница</h1>
<?php
$oUser = new UserControl();
if(isset($_POST['loginBtn']) )
$oUser->login($_POST['username'], $_POST['password']);
if( !$oUser->authorize() )
{  // Отпечатай логин формата
?>
<form method=”post”>
<input type=”text” name=”username” /><br />
<input type=”text” name=”password” /><br />
<input type=”submit” name=”loginBtn” /><br />
</form>
<?php
}
else { // Влизане в приложението
header(“Location: index.php?page=home”);
}
?>
Методът checkUser(), реализацията на който не е показана тук, има задачата да направи справка в базата данни на приложението и да установи има ли регистриран потребител с подадените данни. Ако има такъв, методът връща неговото userid, и то се записва в сесията.
Сесията в PHP програмирането се използва за най-различни цели. Освен контрол на достъпа, др. типични нейни приложения са междинно съхранение на данни м/у 2 и повече заявки, реализация на пейджинг (показване на информация по страници), сортинг на таблици с данни по различни кртитерии и ного други.
В крайна сметка трябва да е ясно, че нито URL параметри, нито бисквитките дават нужното ниво на сигурност за приложения, работещи с поверителни данни – електронна търговия, банкови услуги и т.н. Сигурността в тези случаи може да бъде гарантирана само с криптирането на HTTP връзката посредством SSL.

Няма подобни статии