-
/** - --- クッキー オブジェクトの作成 ---
- $c = new cookie();
-
- --- クッキーの作成/更新 ---
- $c->setName('myCookie') // 必須
- -> setValue($value,true) // 必須 - 1 番目のパラメータ = データ文字列/配列、2 番目のパラメータ = encrypt (true=yes)
- ->setExpire('+1 時間') // オプション - デフォルトは "0" またはブラウザを閉じる
- ->setPath('/') // オプション - デフォルトは /
- ->setDomain('.domain.com') // オプション - 自動検出を試みます
- ->setSecure(false) // オプション - デフォルトは false
- ->setHTTPOnly(false); // オプション - デフォルトは false
- $c->createCookie(); // これもチェーンできますが、最後にする必要があります
-
- --- DESTROY COOKIE ---
- $c->setName('myCookie')->destroyCookie();
- OR
- $c->destroyCookie( 'myCookie');
-
- --- COOKIE を取得 ---
- $cookie = $c->getCookie('myCookie',true); // 1 番目のパラメータ = Cookie 名、2 番目のパラメータ = 復号化するかどうか
- // 値が配列の場合、戻り値をアンシリアル化する必要があります
*/
- Class Cookie {
- // cookie加密键值串、必要に応じて変更可能
- const DES_KEY = bP3dSj7TT10A5Sh60';
private $errors = array();
- private $cookieName = null;
- private $cookieData = null;
- private $cookieKey = null;
- private $cookieExpire = 0;
- private $cookiePath = '/';
- private $cookieDomain = null;
- private $cookieSecure = false;
- private $cookieHTTPOnly = false;
-
- /**
- * コンストラクターはドメインを設定します
- * @access public
- * @return none
- */
- public function __construct()
- {
- $this->cookieDomain = $this->getRootDomain() ;
- }
-
- /**
- * 获取cookie值
- * @access public
- * @param string $cookieName 取得するクッキー
- * @param bool $decrypt 値を復号化するかどうか
- */
- public function getCookie($cookieName=null, $decrypt=false)
- {
- if(is_null($cookieName)){
- $cookieName = $this->cookieName ;
- }
- if(isset($_COOKIE[$cookieName])){
- return ($decrypt?$this->cookieEncryption($_COOKIE[$cookieName],true):base64_decode($_COOKIE[$cookieName])) ;
- } else {
- $this->pushError($cookieName.' not found');
- return false;
- }
- }
-
- /**
- * Cookie を作成します
- * @access public
- * @return bool true/false
- */
- public function createCookie()
- {
- if (is_null($this->cookieName)){
- $this->pushError('Cookie 名が null でした');
- return false;
- }
-
- $ret = setcookie(
- $this->cookieName,
- $this->cookieData、
- $this->cookieExpire、
- $this->cookiePath、
- $this->cookieDomain、
- $this->cookieSecure、
- $this->cookieHTTPOnly
- );
-
- return $ret;
- }
-
- /**
- * 清除cookie
- * @access public
- * @param string $cookieName to kill
- * @return bool true/false
- */
- public function destroyCookie($cookieName=null)
- {
- if(is_null($cookieName)){
- $cookieName = $this->cookieName;
- }
-
- $ret = setcookie(
- $cookieName,
- null,
- (time()-1),
- $this->cookiePath,
- $this->cookieDomain
- );
-
- return $ret;
- }
-
- /**
- * クッキー名を設定します
- * @access public
- * @param string $name クッキー名
- * @returnmixed obj or bool false
- */
- public function setName($name=null)
- {
- if(!is_null($name)){
- $this->cookieName = $name;
- return $this;
- }
- $this->pushError('Cookie 名が null でした');
- return false;
- }
-
- /**
- * 設置cookie值
- * @access public
- * @param string $value cookie value
- * @return bool 文字列が文字列かどうか
- */
- public function setValue($value=null, $encrypt=false)
- {
- if(!is_null($value)){
- if(is_array($value)){
- $ value =serialize($value);
- }
- $data = ($encrypt?$this->cookieEncryption($value):base64_encode($value));
- $len = (function_exists('mb_strlen')?mb_strlen( $data):strlen($data));
- if($len>4096){
- $this->pushError('Cookie データが 4kb を超えています');
- return false;
- }
- $this->cookieData = $data;
- unset($data);
- return $this;
- }
- $this->pushError('Cookie 値が空でした');
- return false;
- }
-
- /**
- * Cookieの有効期限を設定します
- * @access public
- * @param string $time +1週間など
- * @return bool 文字列が文字列かどうか
- */
- public function setExpire($time=0)
- {
- $pre = substr($time,0,1);
- if(in_array($pre, array('+','-'))){
- $this- >cookieExpire = strtotime($time);
- return $this;
- } else {
- $this->cookieExpire = 0;
- return $this;
- }
- }
-
- /**
- * Cookieの保存パスを設定します
- * @access public
- * @param string $path
- * @return object $this
- */
- public function setPath($path='/')
- {
- $this->cookiePath = $path;
- return $this;
- }
-
- /**
- * Cookieが属するドメインを設定します
- * @access public
- * @param string $domain
- * @return object $this
- */
- public function setDomain($domain=null)
- {
- if(!is_null($domain)){
- $this->cookieDomain = $domain;
- }
- return $this;
- }
-
- /**
- *
- * @access public
- * @param bool $secure true/false
- * @return object $this
- */
- public function setSecure($secure =false)
- {
- $this->cookieSecure = (bool)$secure;
- return $this;
- }
-
- /**
- * HTTPOnly フラグ、まだすべてのブラウザで完全にはサポートされていません
- * @access public
- * @param bool $httponly yes/no
- * @return object $this
- */
- public function setHTTPOnly($httponly=false)
- {
- $ this->cookieHTTPOnly = (bool)$httponly;
- return $this;
- }
-
- /**
- * 指定されていない場合はルートドメインを取得するためのジェンキービット
- * @access private
- * @return string Le Domain
- */
- プライベート関数 getRootDomain()
- {
- $host = $_SERVER['HTTP_HOST'];
- $parts =explode('.', $host);
- if(count($parts)>1){
- $tld = array_pop($parts);
- $domain = array_pop($parts).'.'。 $tld;
- } else {
- $domain = array_pop($parts);
- }
- return '.'.$domain;
- }
-
- /**
- * 値の暗号化
- * @access private
- * @param string $str string to be (de|en)crypted
- * @param string $decrypt 復号化するかどうか
- * @return string (de|en)crypted string
- */
- プライベート関数 cookieEncryption($str=null, $decrypt=false)
- {
- if(is_null($str)){
- $this->pushError('null 文字列を暗号化/復号化できません');
- return $str;
- }
- < p> $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
- $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
- $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
- $key = substr(self::DES_KEY,0,$key_size);
if($decrypt){
- $return = mcrypt_decrypt(MCRYPT_3DES, $key, Base64_decode($str), MCRYPT_MODE_ECB, $iv);
- } else {
- $return =base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $str, MCRYPT_MODE_ECB) , $iv));
- }
return $return;
- }
-
- /**
- * エラー配列にエラーを追加します
- * @access public
- * @param string $error
- * @return none
- */
- プライベート関数 PushError($error=null)
- {
- if(!is_null($error)){
- $this->errors[] = $ error;
- }
- return;
- }
-
- /**
- * エラーの取得
- * @access public
- * @return string エラー
- */
- public function getErrors()
- {
- return implode("
", $this->errors);
- }
- }
-
复制代
调用例:
-
-
- require('cookie.class.php');
// サンプルデータ
- $array = array('foo' =>'バー','バー'=>'foo');
- $string = 'これは文字列です';
$c = new Cookie();
/*
- 创建一个加密的クッキー数组
- * /
- echo '
暗号化された配列';
$start = microtime(true);
$c->setName ('Example') // Cookie 名
- ->setValue($array,true) // 2 番目のパラメータ true、データを暗号化します
- ->setExpire('+1 hours') // 1 時間で期限切れになります
- - >setPath('/') // Cookie パス
- ->setDomain('localhost') // ローカルホストに設定
- ->createCookie();
- $cookie = $c->getCookie('例',true);
- $cookie = unserialize($cookie);
$bench = sprintf('%.8f',(microtime(true)-$start));
- < p>echo print_r($cookie,true).'
'.$bench.'秒 ';
/*
- 销毁cookie
- */
- //$c->destroyCookie('Example');
- 创建一クッキー字符串,直接浏览器关闭時失效
- */
- echo '
通常の暗号化されていない文字列';
- $start = マイクロタイム(true);
- $c->setName('Example1')
- ->setValue($string) // ここで 2 番目のパラメータを false に設定できます
- ->setExpire(0)
- ->setPath('/')
- ->setDomain('localhost')
- ->createCookie();
$cookie = $c->getCookie('Example1');
- < p>$bench = sprintf('%.8f',(microtime(true)-$start));
echo print_r($cookie,true).' 「.$ベンチ」秒';
-
复制發
|