Skip to content

Instantly share code, notes, and snippets.

@codeholic
Created March 31, 2011 23:02
Show Gist options
  • Select an option

  • Save codeholic/897444 to your computer and use it in GitHub Desktop.

Select an option

Save codeholic/897444 to your computer and use it in GitHub Desktop.
<?php
ini_set('session.gc_probability', 0);
ini_set('session.cookie_domain', '.plantarium.ru');
session_set_cookie_params(pow(2, 31) - 1, '/', '.plantarium.ru');
define('COOKIED_SESSION_COOKIE_NAME', 'cookied_session');
define('COOKIED_SESSION_KEY',
pack('H*', '8c355bad1cfb778eacf3627511c5a345d6c2705739dff770f844893f2e05cae3'));
function base64url_encode($data) {
return strtr(base64_encode($data), array('+' => '-', '/' => '_'));
}
function base64url_decode($data) {
return base64_decode(strtr($data, array('-' => '+', '_' => '/')));
}
class AES {
private $td;
private $key;
public function AES($key) {
$this->td = mcrypt_module_open('rijndael-256', '', 'cbc', '');
$this->key = substr($key, 0, mcrypt_enc_get_key_size($this->td));
}
private function init($iv) {
return @mcrypt_generic_init($this->td, $this->key, $iv) != -1;
}
public function encrypt($plaintext) {
$iv_size = mcrypt_enc_get_iv_size($this->td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
if (!$this->init($iv)) return false;
$ciphertext = mcrypt_generic($this->td, $plaintext . "\xFF");
mcrypt_generic_deinit($this->td);
return chr($iv_size) . $iv . $ciphertext;
}
public function decrypt($data) {
$iv_size = ord(substr($data, 0, 1));
$iv = substr($data, 1, $iv_size);
if (!$this->init($iv)) return false;
$ciphertext = substr($data, $iv_size + 1);
$plaintext = @mdecrypt_generic($this->td, $ciphertext);
$plaintext = substr(rtrim($plaintext, "\0"), 0, -1);
mcrypt_generic_deinit($this->td);
return $plaintext;
}
}
$cookied_session_cipher = new AES(COOKIED_SESSION_KEY);
function cookied_session_read($id) {
global $cookied_session_cipher;
if (!isset($_COOKIE[COOKIED_SESSION_COOKIE_NAME])) {
return '';
}
$sess_data = base64url_decode($_COOKIE[COOKIED_SESSION_COOKIE_NAME]);
$sess_data = bzdecompress($cookied_session_cipher->decrypt($sess_data));
if ($sess_data < 0) return '';
return $sess_data;
}
function cookied_session_write($id, $sess_data) {
global $cookied_session_cipher;
$value = base64url_encode($cookied_session_cipher->encrypt(bzcompress($sess_data)));
$params = session_get_cookie_params();
setcookie(COOKIED_SESSION_COOKIE_NAME, $value, $params['lifetime'],
$params['path'], $params['domain'], $params['secure'], $params['httponly']);
return true;
}
function cookied_session_destroy($id) {
setcookie(COOKIED_SESSION_COOKIE_NAME, '', time() - 60 * 60 * 24);
return true;
}
function cookied_session_noop() { return true; }
session_set_save_handler(
'cookied_session_noop',
'cookied_session_noop',
'cookied_session_read',
'cookied_session_write',
'cookied_session_destroy',
'cookied_session_noop'
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment