Код: Выделить всё
class CHttpSession extends CApplicationComponent implements IteratorAggregate,ArrayAccess,Countable
{
public $bindingSignVar='BINDING_SIGN';
public $bindingHasher='md5';
protected $bindings=null;
protected $bindingSign=null;
protected $sidrProbability=0;
public function setBindings($data)
{
foreach($data as $binding)
$this->bindings[]=is_a($binding, 'CSessionBinding')?$binding:Yii::createComponent($binding);
}
public function setSIDRProbability($value)
{
$this->sidrProbability=min(100,max(0,(int)$value));
}
public function getBindingSign()
{
if($this->bindingSign===null)
{
$sign = '';
foreach($this->bindings as $binding)
$sign.=$binding->getSign();
$this->bindingSign=$this->bindingHasher?call_user_func($this->bindingHasher,$sign):$sign;
}
return $this->bindingSign;
}
public function open()
{
if(session_id()==='')
{
if($this->getUseCustomStorage())
session_set_save_handler(array($this,'openSession'),array($this,'closeSession'),array($this,'readSession'),array($this,'writeSession'),array($this,'destroySession'),array($this,'gcSession'));
session_start();
if($this->bindings!==null)
{
if($this->getCount()>0)
{
if($this->itemAt($this->bindingSignVar)==$this->getBindingSign())
{
if(mt_rand(0,100)<$this->sidrProbability)
session_regenerate_id(true);
}
else
{
session_regenerate_id();
session_unset();
$this->add($this->bindingSignVar,$this->getBindingSign());
}
}
else
$this->add($this->bindingSignVar,$this->getBindingSign());
}
}
}
}
Код: Выделить всё
class CSessionBinding extends CComponent
{
protected $sign;
public function getSign()
{
if($this->sign===null)
$this->sign=$this->generateSign();
return $this->sign;
}
protected function generateSign()
{
return '';
}
}
Код: Выделить всё
class CUserIPSessionBinding extends CSessionBinding
{
protected function generateSign()
{
return Yii::app()->request->userHostAddress;
}
}
Код: Выделить всё
class CUserAgentSessionBinding extends CSessionBinding
{
protected function generateSign()
{
return Yii::app()->request->userAgent;
}
}
Код: Выделить всё
'components'=>array(
'session'=>array(
'class'=>'CHttpSession',
'bindings'=>array(
'CUserIPSessionBinding',
'CUserAgentSessionBinding'
),
'bindingHasher'=>'crc32',
'sidrProbability'=>10
)
)