Skip to content

Instantly share code, notes, and snippets.

@daviddesberg
Created September 13, 2012 03:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save daviddesberg/3711632 to your computer and use it in GitHub Desktop.
Save daviddesberg/3711632 to your computer and use it in GitHub Desktop.
Client-side PHP Sessions
<?php
class ClientSideSessionHandler implements SessionHandlerInterface
{
const SESSION_COOKIE_NAME = 'data';
private $cryptor;
private $cookieJar;
private $encryptionKey;
private $signingKey;
public function __construct(Cryptor $cryptor, CookieJar $cookieJar, $encryptionKey, $signingKey)
{
$this->cryptor = $cryptor;
$this->cookieJar = $cookieJar;
$this->encryptionKey = $encryptionKey;
$this->signingKey = $signingKey;
}
public function open($savePath, $sessionName)
{
return true;
}
public function close()
{
return true;
}
public function read($id)
{
$data = $this->cookieJar->get( static::SESSION_COOKIE_NAME );
if( !$this->cryptor->verify( $data, $this->signingKey ) ) {
throw new SessionAuthenticationException('Session cookie signature mismatch.');
}
return $this->cryptor->decrypt( $data, $this->encryptionKey );
}
public function write($id, $data)
{
$data = $this->cryptor->sign( $this->cryptor->encrypt( $data, $this->encryptionKey ), $this->signingKey );
$this->cookieJar->set( static::SESSION_COOKIE_NAME, $data );
return true;
}
public function destroy($id)
{
$this->cookieJar->remove( static::SESSION_COOKIE_NAME );
return true;
}
public function gc($maxlifetime)
{
return true;
}
}
<?php
interface CookieJar
{
function get($cookiename);
function set($cookiename, $value);
function remove($cookiename);
}
<?php
interface Cryptor
{
function encrypt($blob, $key);
function decrypt($blob, $key);
function verify($blob, $key);
function sign($blob, $key);
}
<?php
class SessionAuthenticationException extends RuntimeException {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment