И так, по
просьбе пользователя сделал очередной
велосипед класс авторизации с учётом некоторых комментариев того топика.
Скажу сразу — это лишь пример (но рабочий), его можно перекрутить как угодно.
Собственно сие чудо является классом, который использует библиотеку обратимого шифрования XXTEA, но обратное шифрование здесь не применяется (по желанию можно сделать). Он умеет проверять хеш сессии и кукисов, сравнивать их и, по возможности, записывать.Так-же он удобен тем, что возможна установка любых данных для авторизации и в любом кол-ве, будь то логин, пароль или другое значение, исходные значения данных устанавливаются только в параметры сессии, поэтому узнать их будет невозможно
простому рядовому пользователю.На основе данных (и при желании доп. плюшек, см. example в архиве) составляется хеш (отпечаток), который в дальнейшем используется для проверки. Конечный его формат в md5, т.е. 13-значный string.В процессе сравнения идёт проверка на полную действительность совпадений (===).
Для заметки — судя по некоторым последним данным, md5 становится опасно использовать, его отпечаток можно подделать не идентичными данными.
Тело класса:
<?php
session_start();
class MAuth
{
private $sessionId = null;
private $sessionHash = false;
private $cookieHash = false;
private $loged = false;
private $sessionParams = array();
public $key = 'key';
public $hash = '';
public $params = array();
public $sessionAuthName = 'auth';
public $cookieAuthName = 'auth';
public $checkIP = false;
public $checkDate = false;
public $checkBrowser = false;
public $cookieExpire = 0;
public $cookiePath = '';
public $cookieDomain = '';
public $cookieSecure = 0;
public function __construct()
{
$this->sessionId = session_id();
$this->sessionHash = isset($_SESSION[$this->sessionAuthName]) ? $_SESSION[$this->sessionAuthName] : $this->sessionHash;
$this->cookieHash = isset($_COOKIE[$this->cookieAuthName]) ? $_COOKIE[$this->cookieAuthName] : $this->cookieHash;
$this->sessionParams = isset($_SESSION[$this->sessionAuthName.'_params']) ? $_SESSION[$this->sessionAuthName.'_params'] : $this->sessionParams;
}
private function setLoged($loged = false)
{
$this->loged = ($loged) ? true : false;
}
private function setCookie()
{
setcookie($this->cookieAuthName,$this->cookieHash,$this->cookieExpire,$this->cookiePath,$this->cookieDomain,$this->cookieSecure);
}
public function setNewSession()
{
if($this->loged)
{
if(!$this->sessionHash && $this->cookieHash)
$this->sessionHash = $_SESSION[$this->sessionAuthName] = $this->cookieHash;
if(!$this->cookieHash && $this->sessionHash)
{
$this->cookieHash = $this->sessionHash;
$this->setCookie();
}
}
else
{
$this->sessionParams = $_SESSION[$this->sessionAuthName.'_params'] = $this->params;
$hash = $this->setHash();
$this->sessionHash = $_SESSION[$this->sessionAuthName] = $hash;
$this->cookieHash = $hash;
$this->setCookie();
$this->setLoged(true);
}
return;
}
public function checkSession()
{
if(!$this->sessionHash && !$this->cookieHash)
{
$this->setLoged(false);
return false;
}
$data = $this->setHash();
if(!$this->sessionHash && $this->cookieHash === $data)
{
$this->setLoged(true);
$this->setNewSession();
return true;
}
if(!$this->cookieHash && $this->sessionHash === $data)
{
$this->setLoged(true);
$this->setNewSession();
return true;
}
if(($this->cookieHash === $data && $this->sessionHash === $data) && ($this->sessionHash === $this->cookieHash))
{
$this->setLoged(true);
return true;
}
$this->setLoged(false);
return false;
}
private function setHash()
{
$data = implode($this->hash,$this->sessionParams);
if($this->checkIP)
{
$data .= $this->hash.$_SERVER['REMOTE_ADDR'];
}
if($this->checkBrowser)
{
$data .= $this->hash.$_SERVER['HTTP_USER_AGENT'];
}
if($this->checkDate)
{
$data .= $this->hash.date($this->checkDate,time());
}
$data = xxtea_encrypt($data.$this->sessionId,$this->key);
$data = md5(base64_encode($data));
return $data;
}
public function isLoged()
{
return $this->loged;
}
}
Комментировать не стал, простите засранца =) А вообще пример с комментариями есть в файле с примером.
Ссылка на архив с исходниками
UPD: архив перезалит.
Комментарии (0)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.